Проблема:
Вы дали reportReg
тип списка строк:
reportReg :: [String]
Это просто значение или функция0 аргументов.Это объясняет ошибку, которую вы получаете - пытаетесь дать ей аргумент, но она не принимает ничего.
Решения:
ПохожеВы хотите выполнить действия ввода-вывода в reportReg
, поэтому вам следует изменить аннотацию типа:
reportReg :: [String] -> IO ()
- или -
- написать функцию без аннотации типа, пусть Haskell выведет ее для вас, а затем скопировать эту аннотацию
Проблема:
report
Тип возврата неверный.Он должен быть таким же, как у reportReg
.Но reportReg :: String -> IO ()
, тогда как report :: [[String]] -> String -> [String]
!
Пара возможных решений:
- удалить действия ввода-вывода из
reportReg
, чтобы его тип был [String] -> [String]
.Я настоятельно рекомендую сделать это - ввод-вывод на любом языке - это всегда боль, но в Haskell замечательно то, что он заставляет вас чувствовать боль - тем самым дает вам стимул избегать ввода-вывода в максимально возможной степени! - изменить тип
report
на [[String]] -> String -> IO ()
Решение для ленивого:
Я скопировал ваш код в текстовый файл,удалил аннотации (не внося никаких других изменений) и загрузил их в ghci
:
Prelude> :load typef.hs
[1 of 1] Compiling Main ( typef.hs, interpreted )
Ok, modules loaded: Main.
*Main> :t report
report :: (Eq a, Show a) => [[a]] -> [Char] -> IO ()
*Main> :t reportReg
reportReg :: (Eq a, Show a) => [a] -> IO ()
*Main> :t instances
instances :: (Num t, Eq a) => a -> [a] -> t
Работает - Haskell выводит типы! Но он может не делать то, что вы хотите.