2016-04-26 81 views
0

我有一個非常簡單的函數叫做'fold',它接受函數f並執行它。給定一個函數'add'和兩個數字,它會調用這兩個數字並顯示結果。但是由於下面的編譯錯誤,我無法編譯它。什麼是錯誤,具體說明和我能做些什麼來解決它?Haskell - 傳遞一個函數作爲參數編譯錯誤

module Main where 

    add x y = x + y 

    --fold :: ((a,b)->c) -> a->b->c 

    fold f n x = f n x 


    main :: IO() 
    main = do 
     fold add 2 3 

enter image description here

+0

您聲明'main'應該返回'IO()'。 'fold add 2 3'返回什麼?你怎麼能把返回的值變成'IO()'? –

+0

如果我將IO()更改爲Integer,則會給出「無法與實際類型'Integer'匹配的預期類型'IO t0'」 – BDillan

回答

6

的問題是,你聲明main(正確地)具有類型IO(),但fold不返回。該錯誤消息稍微複雜一點,因爲理論,add(因此fold)可能會返回類型爲IO()的值,因爲add可以使用Num實例返回任何類型。然而,IO()而不是Num的實例。解決方法是返回從fold的返回值創建的IO操作。一種方法是使用print函數(該函數在輸出Show實例的同時將其轉換爲String)。

main = print $ fold add 2 3