Как создать функцию Haskell, которая превращает IO String в IO [String]? - PullRequest
7 голосов
/ 08 марта 2011

Я начал изучать Хаскель и чувствую себя подавленным этим.Я сейчас пытаюсь создать функцию, которая либо возвращает строку из стандартного ввода или из содержимого списка файлов.Другими словами, я пытаюсь повторить поведение утилиты Unix wc, которая принимает данные из stdin, когда файлы не указываются.

Я создал что-то вроде этого:Но он не компилируется, так как в одном случае у меня есть [IO String], а в другом IO [String].Я не могу сделать это сопоставление с шаблоном, чтобы вернуть IO [String] во всех случаях.Пожалуйста, укажите мне правильное направление.

1 Ответ

7 голосов
/ 08 марта 2011

Чтобы сделать первый шаблон также IO [String], вы должны сначала распаковать значение из списка, а затем упаковать его.Примерно так:

do c <- getContents
   return [c]

В обычной монадической записи:

getContents >>= \c -> return [c]

В таком случае обычно лучше использовать функтор вместо монады,Тогда вы можете избежать использования return:

fmap (:[]) getContents

(:[]), имеющего то же значение, что и \x -> [x], он создает одноэлементный список.

...