我想通過Haskell瞭解函數式編程,我在處理函數組合方面遇到了很多麻煩。有兩個參數的Haskell組合
其實我有這兩個功能:
add:: Integer -> Integer -> Integer
add x y = x + y
sub:: Integer -> Integer -> Integer
sub x y = x - y
我希望能夠撰寫他們。它沒有任何意義,但它是一個學習目標。
我已經試過:
foo:: (Integer -> Integer) -> (Integer -> Integer) -> Integer
foo = add . sub
就我的理解:
Haskell使用的功能只有一個指定參數時,讓我們回到一個新的功能後,每次執行函數執行。
因此,第一個Integer
是參數類型,而第二個是生成函數的返回類型,它必須添加第二個數字。
這將返回另一個函數(sub
),將使得同樣的流程(返回使用參數等功能...)
我說得對不對?
這裏是我的實際錯誤代碼:
src\Main.hs:23:7:
Couldn't match type `Integer' with `Integer -> Integer'
Expected type: Integer -> (Integer -> Integer) -> Integer
Actual type: Integer -> Integer -> Integer
In the first argument of `(.)', namely `add'
In the expression: add . sub
src\Main.hs:23:13:
Couldn't match type `Integer -> Integer' with `Integer'
Expected type: (Integer -> Integer) -> Integer
Actual type: Integer -> Integer -> Integer
Probable cause: `sub' is applied to too few arguments
In the second argument of `(.)', namely `sub'
In the expression: add . sub
我不知道我做錯了。
你能幫我理解更多這個錯誤,所以我可以找到解決方案嗎?
你說得對,它「沒有任何意義」 - 有沒有在數學組成二元函數的概念。如果你想使它有意義,你需要首先定義什麼「構成」加法和減法手段。 – molbdnilo
你的foo類型表示加法和減法的組合是一個函數,它接受兩個*函數*(整數 - >整數)並返回一個整數。 – molbdnilo