繁体   English   中英

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中,每个函数都带有一个参数并返回一个值( a -> b -> ca -> (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 -> a a- a -> a -> a不兼容。 您不能使用元组来使用该函数,因为它无论如何都只有一个参数,并且不返回任何函数类型。

在库中,我们有一个函数curry可以转换

f :: (A,B) -> C
f (a,b) = ...

变成g = curry f ,定义为

g :: A -> B -> C
g a b = ...

我们还有一个逆变换,称为uncurry ,它将g映射回f = uncurry g

有时,像g这样的f称为“ curried”,而像f这样的f称为“ uncurried”。 这种说法有点非正式,因为我们应该更恰当地说,“ gf的咖喱形式”和“ fg的未经咖喱形式”。

单独的“ curried”和“ uncurried”功能之间没有完美的区别。 例如, h :: (A,B) -> C -> D可以看成是h1 :: ((A,B),C) -> Dh2 :: A -> B -> C -> D ,因此将同时对其进行咖喱化处理。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM