这是未经处理的函数:
prod :: Integer -> Integer -> Integer -> Integer -> Integer
prod x y z t = x * y * z * t
这已经是一个柯里化函数。事实上,Haskell 中的所有函数都是自动柯里化的。实际上,您在这里编写了一个如下所示的函数:
prod :: Integer -> (Integer -> (Integer -> (Integer -> Integer)))
Haskell 将因此生成一个如下所示的函数:
prod :: Integer -> (Integer -> (Integer -> (Integer -> Integer)))
prod = \x -> (\y -> (\z -> (\t -> 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
。