Haskell monadic IO

时间:2011-06-18 20:39:54

标签: haskell types io monads

compute fp = do
    text <- readFile fp
    let (a,b) = sth text
    let x = data b 
    --g <- x
    putStr $ print_matrix $ fst $ head $ x

当我只得到第一个元素时,它可以工作,但我想对对列表中的所有元素执行此操作。 当我写g&lt; - x我得到了无法匹配的预期类型`IO t0'                 实际类型[([[Integer]],[[Integer]])]

2 个答案:

答案 0 :(得分:3)

你在IO Monad里面,所以每当你写一个“绑定”箭头<-时,右边的东西必须是IO操作。简而言之,您不希望在值<-上使用x

现在,您似乎想要为列表的每个元素而不是单个元素调用print_matrix。在那种情况下,我认为Macke走在正确的轨道上,但我会改用mapM_:

mapM_ (putStr . print_matrix . fst) x

应该做的伎俩。

原因是你明确表示你想要{​​{1}}每个元素,一次一个,但你不关心putStr本身的结果。

答案 1 :(得分:2)

听起来mapM可能适合您的帐单:Monad a => (b -> a c) -> [b] -> a [c]

它用于将monadic函数应用于列表,并在monad中获取列表