У меня есть список строк, и попытался это:Haskell: не может использовать «map putStrLn»?
ls = [ "banana", "mango", "orange" ]
main = do
map PutStrLn list_of_strings
Это не сработало, и я не могу понять, почему.
ghc print-list.hs
print-list.hs:3:0:
Couldn't match expected type `IO t' against inferred type `[IO()]'
In the expression: main
When checking the type of the function `main'
Какие-либо намеки? Я полагаю, что это связано с тем, что карта возвращает список, а не значение, но я не нашел простой способ исправить это.
В настоящее время единственным способом, которым я знаю, чтобы напечатать список строк, является запись функции, которая будет перебирать список, печатать каждый элемент (печатать, если список [a], но печатать и возвращать, если это (a: б)). Но это было бы много проще просто использовать карту ...
Спасибо!
Что-то, чего я бы хотел, чтобы я узнал намного раньше, было то, что есть еще один mapM, определенный в Data.Traversable. Этот mapM работает с большим количеством структур данных в дополнение к спискам, таким как карты и массивы. –
Я всегда думал, что 'main' должен быть типа' IO() ', никогда не знал, что это может быть' forall t. IO t'. Это показывает, как вы можете узнать что-то новое каждый день :-) –