Невозможно обосновать ограничения в явно типизированной привязке

#haskell

#haskell

Вопрос:

Я пытаюсь написать простую функцию поиска пути, но у меня возникли проблемы с неоднозначной ошибкой Haskell.

Это мой код (упрощенный, чтобы указать на ошибку)

 routes :: int -> int -> [(int,int)] -> [[int]]
routes start finish waypoints = [[4]]
  

И это ошибка, которую я получаю

 ERROR "/home/freefrag/Routes":2 - Cannot justify constraints in explicitly typed binding
*** Expression    : routes
*** Type          : a -> a -> [(a,a)] -> [[a]]
*** Given context : ()
*** Constraints   : Num a
  

может кто-нибудь сообщить мне, что я делаю не так?

Комментарии:

1. int является универсально определяемой переменной типа, а не типом целочисленных значений.

Ответ №1:

Используйте заглавные буквы ваших типов. Вот так:

 routes :: Int -> Int -> [(Int,Int)] -> [[Int]]
routes start finish waypoints = [[4]]
  

Типы начинаются с прописных букв. Переменные типа начинаются со строчных букв.

Ответ №2:

Вы имеете в виду?:

 Int -> Int -> [(Int, Int)] -> [[Int]] 
  

В противном случае попробуйте:

 routes :: Num int => int -> int -> [(int,int)] -> [[int]]
routes start finish waypoints = [[4]]
  

См. Раздел 2.4, Идентификаторы и операторы, в отчете Haskell 98.Он читает цитату:

«Идентификаторы лексически разделяются на два пространства имен (раздел 1.4): те, которые начинаются со строчной буквы (идентификаторы переменных), и те, которые начинаются с прописной буквы (идентификаторы конструктора)».