#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): те, которые начинаются со строчной буквы (идентификаторы переменных), и те, которые начинаются с прописной буквы (идентификаторы конструктора)».