Хаскель монадический IO - PullRequest
2 голосов
/ 19 июня 2011
compute fp = do
    text <- readFile fp
    let (a,b) = sth text
    let x = data b 
    --g <- x
    putStr $ print_matrix $ fst $ head $ x

Это работает, когда я получаю только первый элемент, но я хочу сделать это для всех элементов в списке пары. Когда я пишу g <- x, я получаю Не могу найти ожидаемый тип `IO t0 ' с фактическим типом [([[Integer]], [[Integer]])] </p>

Ответы [ 2 ]

3 голосов
/ 19 июня 2011

Вы находитесь внутри монады ввода-вывода, поэтому каждый раз, когда вы пишете стрелку «bind» <-, справа должна быть операция ввода-вывода. Итак, короткий ответ: вы не хотите использовать <- для значения x.

Теперь, похоже, вы хотите вызвать print_matrix для каждого элемента списка, а не для одного элемента. В этом случае я думаю, что Macke находится на правильном пути, но я бы вместо этого использовал mapM_:

mapM_ (putStr . print_matrix . fst) x

должен сделать свое дело.

Причина в том, что вы явно говорите, что хотите putStr каждый элемент, по одному, но вас не волнует результат самого putStr.

2 голосов
/ 19 июня 2011

Звучит так, как будто mapM может соответствовать вашему счету: Monad a => (b -> a c) -> [b] -> a [c]

Используется для применения монадической функции к списку и получения списка обратно в монаде

...