返回信息流翻书翻到了Haskell 于是就找了个教程看了一下 发现currify太绕了
对于下面这个lambda表达式
addThree :: (Num a) => a -> a -> a -> a
addThree = \x -> \y -> \z -> x + y + z
有两点没弄懂:
1、这玩意怎么传参的,=前压根没东西。
2、处理到\z的时候 它怎么知道有 x 和 y。
另外 addThree = \x -> (\y -> (\z -> z) + y) + x 为什么又过不了呢?
这是一条镜像帖。来源:北邮人论坛 / soft-design / #40665同步于 2011/5/3
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖
继续问一个纠结我的Haskell问题
HectorInsanE
2011/5/3镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
【lambda表达式是右结合的:】
addThree = \x -> \y -> \z -> x + y + z = \x -> (\y -> (\z -> x + y + z))
其实,你可以写addThree x y z = x + y + z,是等效的
addThree 1 4 9
【函数应用(调用)是左结合的】
= (((addThree 1) 4) 9)
【代换addThree】
= ((((\x -> (\y -> (\z -> x + y + z))) 1) 4) 9)
【代换x】
= (((\y -> (\z -> 1 + y + z)) 4) 9)
【代换y】
= ((\z -> 1 + 4 + z) 9)
【代换z】
= 1 + 4 + 9
【计算】
= 14
f :: (Int,Int)->Int
f (x,y) = x+y
g :: Int->Int->Int
g x y = x+y
那么
curry f = g
uncurry g = f
我觉得更重要的问题在于为何需要有 Currying,以及它的用途和使用场景
Currying 是跟 Continuation-passing style 有关系吧?
【 在 wks 的大作中提到: 】
: f :: (Int,Int)->Int
: f (x,y) = x+y
: g :: Int->Int->Int
: ...................
我觉得是partial function
比如
f x y = x + y
g (x,y) = x + y
如果要用map函数,那么currying会方便的多:
map (f 5) [1,2,3] = [6,7,8]
map (\y -> f 5 y) [1,2,3] = [6,7,8] --和上面那个一样。但是罗嗦
map (\y -> g (5,y)) [1,2,3] = [6,7,8] --也是一样,但是g不得不这样做
其实Haskell可以直接这样
map (5+) [1,2,3] = [6,7,8]
【 在 coolfantasy 的大作中提到: 】
: 我觉得更重要的问题在于为何需要有 Currying,以及它的用途和使用场景
: Currying 是跟 Continuation-passing style 有关系吧?
: 【 在 wks 的大作中提到: 】
: ...................
简单的说 Curry 跟高阶函数相关?
【 在 wks 的大作中提到: 】
: 我觉得是partial function
: 比如
: f x y = x + y
: ...................