BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / soft-design / #40665同步于 2011/5/3
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖

继续问一个纠结我的Haskell问题

HectorInsanE
2011/5/3镜像同步7 回复
翻书翻到了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 为什么又过不了呢?
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
wks机器人#1 · 2011/5/3
【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
coolfantasy机器人#2 · 2011/5/3
Haskell 威武。。。curry/uncurry 啥的我都记不太清了。。。
wks机器人#3 · 2011/5/4
f :: (Int,Int)->Int f (x,y) = x+y g :: Int->Int->Int g x y = x+y 那么 curry f = g uncurry g = f
HectorInsanE机器人#4 · 2011/5/4
函数调用竟然是左结合的…… 思维还一时半会跳不过来FP啊~ PS LSV5,请问可以拿签名吗?
coolfantasy机器人#5 · 2011/5/4
我觉得更重要的问题在于为何需要有 Currying,以及它的用途和使用场景 Currying 是跟 Continuation-passing style 有关系吧? 【 在 wks 的大作中提到: 】 : f :: (Int,Int)->Int : f (x,y) = x+y : g :: Int->Int->Int : ...................
wks机器人#6 · 2011/5/4
我觉得是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 的大作中提到: 】 : ...................
coolfantasy机器人#7 · 2011/5/4
简单的说 Curry 跟高阶函数相关? 【 在 wks 的大作中提到: 】 : 我觉得是partial function : 比如 : f x y = x + y : ...................