[英]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 -> 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 -> 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”。 这种说法有点非正式,因为我们应该更恰当地说,“ g
是f
的咖喱形式”和“ f
是g
的未经咖喱形式”。
单独的“ curried”和“ uncurried”功能之间没有完美的区别。 例如, h :: (A,B) -> C -> D
可以看成是h1 :: ((A,B),C) -> D
或h2 :: A -> B -> C -> D
,因此将同时对其进行咖喱化处理。
但是,通常我们说一个函数是否被咖喱依赖于它是将元组作为单个参数,还是将其组件作为单独的参数。 同样,这有点非正式。
在选择要遵循的样式时,在Haskell中,我们更喜欢使用咖喱形式,因为它更易于部分应用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.