Haskell: 如何识别柯里化函数?

Haskell: How to recognize a curried function?

给定以下两个函数:

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

没关系,因为每个 接受多个参数的函数都是柯里化函数。在 Haskell 中,每个函数都有一个参数和 return 一个值(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 类型不兼容。您不能用元组柯里化函数,因为它无论如何只有一个参数并且没有 return 一种函数类型。

在库中,我们有一个函数 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 是 [=15= 的非柯里化形式” ]".

"curried" 和 "uncurried" 函数本身并没有完美的区别。例如,h :: (A,B) -> C -> D 可以看作是 h1 :: ((A,B),C) -> D 的柯里化或 h2 :: A -> B -> C -> D 的非柯里化,因此它同时是柯里化和非柯里化。

不过,我们经常说一个函数是否柯里化取决于它是将元组作为单个参数还是将其组件作为单独的参数。同样,这有点不正式。

在选择要遵循的样式时,在 Haskell 中我们更喜欢柯里化形式,因为它更容易部分应用。