Что не так с "func :: String -> [Int]; func = read" [3,5,7] "" - PullRequest
0 голосов
/ 25 февраля 2019

В очень простом модуле test, где у меня есть следующая функция

func :: String -> [Int]
func = read "[3,5,7]"

Поскольку у меня есть явные аннотации типов, я ожидаю получить [3,5,7], когда я загружаю модуль test и вызываюfunc в ghci.Тем не менее, я получил

    • No instance for (Read (String -> [Int]))
        arising from a use of ‘read’
        (maybe you haven't applied a function to enough arguments?)
    • In the expression: read "[3,5,7]"
      In an equation for ‘func’: func = read "[3,5,7]"
   |
11 | func = read "[3,5,7]"
   |        ^^^^^^^^^^^^^^

Но когда я делаю read "[3,5,7]" :: [Int], [3,5,7] возвращается, как ожидалось.Почему возникла ошибка при загрузке модуля?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Ваш тип функции String -> [Int], но вы не указали его аргумент, поэтому компилятор "думает", что вы хотите вернуть функцию String -> [Int] вместо [Int].

Возможно, вы захотите:

func :: String -> [Int]
func s = read s

, а затем используйте его как:

func "[3,5,7]"

или просто:

func :: String -> [Int]
func _ = read "[3,5,7]"
0 голосов
/ 25 февраля 2019

Вы пытаетесь прочитать вашу строку как функцию типа String -> [Int], а не список [Int].Однако read не может преобразовать строки в функции.

Попробуйте вместо этого:

myList :: [Int]
myList = read "[3,5,7]"
...