Другие хорошо объяснили ваш код, поэтому позвольте мне помочь вам расшифровать сообщение об ошибке.
Couldn't match expected type `[a] -> [Integer]'
against inferred type `IO ()'
In the expression:
putStrLn ("factorList is : " ++ show quotient) []
Я пропустил все остальные части "В выражении"; они просто показывают все больше и больше окружающего контекста.
Все в Haskell является выражением, поэтому у всего есть тип. Это включает в себя что-то вроде "putStrLn". Если вы наберете «: t putStrLn» в GHCi, вы увидите ответ:
putStrLn :: String -> IO ()
Это означает, что putStrLn - это функция, которая принимает строку и возвращает «действие ввода-вывода», которое в данном случае является действием вывода сообщения на экран. В вашем коде вы дали строку «putStrLn», поэтому компилятор сделал вывод, что выражение «putStrLn ( stuff )» имеет тип «IO ()». Это часть «выведенного типа» в сообщении об ошибке компилятора.
Тем временем компилятор также делал вывод типов в другом направлении, извне. Среди прочего он заметил, что выражение this "putStrLn ( stuff )", казалось, применялось к пустому списку. , который имеет тип «[a]» (то есть список чего-то, мы не знаем, что). Кроме того, результат всего выражения должен иметь тип «[Integer]». Следовательно, выражение «putStrLn ( stuff )» должно быть функцией, превращающей «[]» в список целых чисел, тип которого записывается как «[a] -> [Integer]». Это часть ожидаемого типа сообщения об ошибке.
В этот момент компилятор пришел к выводу, что он не может сопоставить эти два типа, поэтому он сообщил об ошибке.
"Не удалось сопоставить ожидаемый тип ' Foo ' с логическим типом ' Bar '", вероятно, является наиболее распространенным сообщением об ошибке, которое вы получаете при попытке компилировать Haskell, поэтому его стоит попробовать читать и понимать это. Посмотрите на предполагаемый тип и попытайтесь выяснить, какая часть выражения в кавычках имеет этот тип. Затем попытайтесь выяснить, почему компилятор ожидал чего-то другого, посмотрев на окружающий код.