Haskell:如何识别咖喱函数?

时间:2018-06-28 12:15:40

标签: haskell currying

提供以下两个功能:

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

2 个答案:

答案 0 :(得分:4)

这没关系,因为每个函数都使用多个参数是一个curried函数。在Haskell中,每个函数都带有一个参数并返回一个值(a -> b -> ca -> (b -> c)相同)。

用户不必担心该功能是否已被咖喱化。

您提供的两个函数定义被视为同一函数。用户无需关心minCur的行为以及其类型。

对于带有元组的版本,它具有不同的类型。所以

 min (a, b) = if a > b then b else a
 min :: Ord p => (p, p) -> p

并且类型(a, a) -> aa -> 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”。这种说法有点非正式,因为我们应该更恰当地说,“ gf的咖喱形式,而“ f是{{1}的非咖喱形式}”。

“咖喱”功能和“非咖喱”功能之间并没有完美的区别。例如,g可以看作是h :: (A,B) -> C -> D的使用,也可以看作是h1 :: ((A,B),C) -> D的使用,因此它将同时被管理和不使用。

不过,通常我们说一个函数是否被咖喱依赖于它是将元组作为单个参数,还是将其组件作为单独的参数。同样,这有点非正式。

在选择要遵循的样式时,在Haskell中,我们更喜欢使用咖喱形式,因为它更易于部分应用。