2011-06-18 95 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