![](/img/trans.png)
[英]How do you define and use curry and uncurry (Prelude functions) in Haskell?
[英]How to curry functions in Haskell
我有一個函數multThree,用於將3個數字相乘,從而可以使用curring。 但是,當我嘗試將其擴展為使用相同結構將四個數字相乘時,它不起作用。 為什么會這樣,如何解決?
multThree :: Num a => a -> (a -> (a -> a))
multThree x = (*) . (*) x
multFour :: Num a => a -> (a -> (a -> (a -> a)))
multFour x = (*) . (*) . (*) x
錯誤提示:
• Occurs check: cannot construct the infinite type: a ~ a -> a
Expected type: a -> a -> a -> a
Actual type: a -> (a -> a) -> a -> a
• In the expression: (*) . (*) . (*) x
In an equation for ‘multFour’: multFour x = (*) . (*) . (*) x
• Relevant bindings include
x :: a (bound at test2.hs:19:10)
multFour :: a -> a -> a -> a -> a
讓我們寫出不帶(.)
:
multFour x = (*) . (*) . (*) x
= (*) . (\y -> (y*)) . (x*)
= (\w -> (w*)) . (\z -> ((x*z)*))
= (\w -> (w*)) . (\z v -> x*z*v)
= \z -> \u -> (\v -> x*z*v) * u
因此,我們看到我們正在嘗試將一個函數乘以一個數字。
關鍵錯誤是這樣的:
multFour x = (*) . multThree x
類型是:
(*) :: Num a => a -> (a -> a)
multThree x :: Num b => b -> (b -> b)
x :: b
(.) :: (y -> z) -> (x -> y) -> (x -> z)
因此,類型統一為:
a = y
z = (a -> a)
b = x
y = b -> b
multFour :: Num b => b -> x -> z
multFour :: (Num b, Num (b -> b)) => b -> b -> (b -> b) -> (b -> b)
這不是您想要的類型。
要修復您的代碼,我建議:
multFour a b c d = a * b * c * d
這更具可讀性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.