提供以下两个功能:
minCur a = (\b -> if a > b then b else a)
minCur a b = if a > b then b else a
询问两者的类型结果:
minCur :: Ord p => p -> p -> p
该函数的用户如何知道他是否正在处理咖喱函数?甚至有关系吗?
编辑:
这是在招惹吗?
minCur (a,b) = if a > b then b else a
答案 0 :(得分:4)
这没关系,因为每个函数都使用多个参数是一个curried函数。在Haskell中,每个函数都带有一个参数并返回一个值(a -> b -> c
与a -> (b -> c)
相同)。
用户不必担心该功能是否已被咖喱化。
您提供的两个函数定义被视为同一函数。用户无需关心minCur
的行为以及其类型。
对于带有元组的版本,它具有不同的类型。所以
min (a, b) = if a > b then b else a
min :: Ord p => (p, p) -> p
并且类型(a, a) -> a
和a -> a -> a
不兼容。您无法使用元组来使用该函数,因为它无论如何都只有一个参数,并且不返回任何函数类型。
答案 1 :(得分:2)
在库中,我们有一个函数curry
可以进行转换
f :: (A,B) -> C
f (a,b) = ...
进入g = curry f
,定义为
g :: A -> B -> C
g a b = ...
我们还有一个称为uncurry
的逆变换,它将g
映射回f = uncurry g
。
有时,诸如g
之类的功能称为“ curried”,而诸如f
之类的功能称为“ uncurried”。这种说法有点非正式,因为我们应该更恰当地说,“ g
是f
的咖喱形式,而“ f
是{{1}的非咖喱形式}”。
“咖喱”功能和“非咖喱”功能之间并没有完美的区别。例如,g
可以看作是h :: (A,B) -> C -> D
的使用,也可以看作是h1 :: ((A,B),C) -> D
的使用,因此它将同时被管理和不使用。
不过,通常我们说一个函数是否被咖喱依赖于它是将元组作为单个参数,还是将其组件作为单独的参数。同样,这有点非正式。
在选择要遵循的样式时,在Haskell中,我们更喜欢使用咖喱形式,因为它更易于部分应用。