2011-06-18 100 views
2
compute fp = do 
    text <- readFile fp 
    let (a,b) = sth text 
    let x = data b 
    --g <- x 
    putStr $ print_matrix $ fst $ head $ x 

它工作时,我只得到第一个元素,但我想做这对列表上的所有元素。 当我写摹< - 喜有无法比拟预期的类型`IO T0' 与实际类型[([整数],[[整数]])]Haskell monadic IO

+1

'let x = data b'我很困惑。 'data'是Haskell中用于定义类型的关键字。该行现在是一个语法错误。 –

回答

3

你是IO单子这里里面,所以任何时候你写了一个“绑定”箭头<- ,右边的东西必须是IO操作。所以简短的回答是,你不想在价值x上使用<-

现在,它看起来像你想调用列表中的每个元素而不是单个元素的print_matrix。在这种情况下,我认为是马科在正确的轨道上,但我会用mapM_代替:

mapM_ (putStr . print_matrix . fst) x 

应该做的伎俩。

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

2

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

它用于一个一元函数应用到列表,并得到一个列表,在单子

+0

thx it works great – XYZ

+0

@XYZ:很高兴帮助!请注意,在此,您应该“接受”通过单击绿色箭头帮助您解决问题的答案。 (并提供有用的所有答案。) – Macke