問題

我開始學習Haskell,所以我需要理解curring(這是我第一次看到這種技術).我想我得到它在某些情況下的工作方式,其中currination只“消除”其中一個引數.就像在下一個例子中我試圖計算4個數字的產品. 這是uncurred函式:

 prod :: Integer->Integer->Integer->Integer->Integer
prod x y z t = x * y * z * t
 

這是curred函式:

 prod' :: Integer->Integer->Integer->Integer->Integer
prod' x y z = (*) (x*y*z)
 

但我不明白如何繼續這個動態,例如只使用兩個引數執行相同的函式,等等:

 prod'' :: Integer->Integer->Integer->Integer->Integer
prod'' x y =
 

  最佳答案

這是uncurred函式:

 prod :: Integer -> Integer -> Integer -> Integer -> Integer
prod x y z t = x * y * z * t
 

這已經是一個curred函式.事實上,Haskell中的所有函式都是自動curred.實際上,您在這裡寫了一個函式,如下所示:

 prod :: Integer -> (Integer -> (Integer -> (Integer -> Integer)))
 

因此,Haskell將生成一個如下所示的函式:

 prod :: Integer -> (Integer -> (Integer -> (Integer -> Integer)))
prod = \x -> (\y -> (\z -> (	 -> x * y * z * t)))
 

事實上,我們可以例如生成這樣的功能:

 prod2 = prod 2
 

這將有型別:

 prod2 :: Integer -> (Integer -> (Integer -> Integer))
prod2 = prod 2
 

我們可以繼續:

 prod2_4 :: Integer -> (Integer -> Integer)
prod2_4 = prod2 4
 

最終:

 prod2_4_6 :: Integer -> Integer
prod2_4_6 = prod2_4 6
 

編輯

函式prod'有:

 prod'' x y = (*) ((*) (x*y))
 

因為這意味著您將(*) (x*y)與下一個引數相乘.但(*) (x*y)是一個函式.您只能乘以數字.嚴格地說,您可以製作函式數.但Haskell編譯器因此抱怨:

 Prelude> prod'' x y = (*) ((*) (x*y))

<interactive>:1:1: error:
    • Non type-variable argument in the constraint: Num (a -> a)
      (Use FlexibleContexts to permit this)
    • When checking the inferred type
        prod'' :: forall a.
                  (Num (a -> a), Num a) =>
                  a -> a -> (a -> a) -> a -> a
 

因此,它說這裡的目標是使用函式a -> a作為第一個運算元執行操作,但這個函式不是Num型別類的例項.

  相同標籤的其他問題

haskellcurryingpointfreetacit-programming