[lyah] curry 的理解?

5 views
Skip to first unread message

Zoom.Quiet

unread,
Feb 23, 2012, 10:22:25 PM2/23/12
to fleurer.lee, haske...@googlegroups.com
lyah 真心好书,代码选择,描述手法,,,没有压力的进入 FP 世界,,,
不过, curry 化太神奇了,俺有点转不过筋来,,,

山寨 sum 函式时:
sum' xs = foldl (\acc x -> acc + x) 0 xs
同:
sum' = foldl (+) 0

?! @___@ 俺感受出的:
- acc 只是常用的累加指代,类似 xs 没有具体含义的?
- xs 两边儿都有可以消去,,
- + 其实是个函式:
(+) :: Num a => a -> a -> a
接受一个参数,返回一个新函式
- \acc x -> acc + x 这么大个匿名函式,怎么就变成 (+) 的?


--
人生苦短, Pythonic! 冗余不做,日子甭过!备份不做,十恶不赦!
俺: http://about.me/zoom.quiet
文字协议: http://creativecommons.org/licenses/by-sa/2.5/cn/

Zoom.Quiet

unread,
Feb 23, 2012, 10:28:45 PM2/23/12
to fleurer.lee, haske...@googlegroups.com
在 2012年2月24日 上午11:22,Zoom.Quiet <zoom....@gmail.com> 写道:
> lyah 真心好书,代码选择,描述手法,,,没有压力的进入 FP 世界,,,
> 不过, curry 化太神奇了,俺有点转不过筋来,,,
>
> 山寨 sum 函式时:
> sum' xs = foldl (\acc x -> acc + x) 0 xs
> 同:
> sum' = foldl (+) 0
>
> ?! @___@ 俺感受出的:
> - acc 只是常用的累加指代,类似 xs 没有具体含义的?
> - xs 两边儿都有可以消去,,
> - + 其实是个函式:
>    (+) :: Num a => a -> a -> a
>    接受一个参数,返回一个新函式
> - \acc x -> acc + x 这么大个匿名函式,怎么就变成 (+) 的?
>

ghci> :t 是个好工具;
- 俺继续乱感觉:
+ \acc x -> acc + x 写成独立函式
let add' = \appd x -> appd + x
+ :t add'
add' :: Integer -> Integer -> Integer
+ 很象 (+) 的了,,,
+ ad'd 4 5 同 4 `ad'd` 5
+ 那么,只要两个函式 :t 起来,使用起来一样,就可以直接替换 ?!

可,没有 curry 化什么事儿吼?!
那么:
let a'dd appd x = appd + x
:t a'dd
a'dd :: Num a => a -> a -> a
let ad'd = (+)
也就成立了,,,

哈!!! curry 化,就是数学里的消元?!

yi huang

unread,
Feb 23, 2012, 10:29:39 PM2/23/12
to haske...@googlegroups.com
2012/2/24 Zoom.Quiet <zoom....@gmail.com>

lyah 真心好书,代码选择,描述手法,,,没有压力的进入 FP 世界,,,
不过, curry 化太神奇了,俺有点转不过筋来,,,

山寨 sum 函式时:
sum' xs = foldl (\acc x -> acc + x) 0 xs
同:
sum' = foldl (+) 0

?! @___@ 俺感受出的:
- acc 只是常用的累加指代,类似 xs 没有具体含义的?
 
acc 就是个普通名字

- xs 两边儿都有可以消去,,

eta-变换 
f x = g x <==> f = g
 
- + 其实是个函式:
   (+) :: Num a => a -> a -> a
   接受一个参数,返回一个新函式
- \acc x -> acc + x 这么大个匿名函式,怎么就变成 (+) 的?

a + b = (+) a b
add a b = a `add` b
 


--
人生苦短, Pythonic! 冗余不做,日子甭过!备份不做,十恶不赦!
俺: http://about.me/zoom.quiet
文字协议: http://creativecommons.org/licenses/by-sa/2.5/cn/

--
您收到此邮件是因为您订阅了 Google 网上论坛的“HaskellCUG”论坛。
要向此网上论坛发帖,请发送电子邮件至 haske...@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 haskellcug+...@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/haskellcug?hl=zh-CN 访问此网上论坛。




--
http://www.yi-programmer.com/blog/

yi huang

unread,
Feb 23, 2012, 10:33:47 PM2/23/12
to haske...@googlegroups.com
2012/2/24 Zoom.Quiet <zoom....@gmail.com>
curry化就是:

a -> b -> c  <=>  a -> (b -> c)
 


--
人生苦短, Pythonic! 冗余不做,日子甭过!备份不做,十恶不赦!
俺: http://about.me/zoom.quiet
文字协议: http://creativecommons.org/licenses/by-sa/2.5/cn/

--
您收到此邮件是因为您订阅了 Google 网上论坛的"HaskellCUG"论坛。
要向此网上论坛发帖,请发送电子邮件至 haske...@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 haskellcug+...@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/haskellcug?hl=zh-CN 访问此网上论坛。




--
http://www.yi-programmer.com/blog/

Zoom.Quiet

unread,
Feb 23, 2012, 11:38:08 PM2/23/12
to yi.cod...@gmail.com, haske...@googlegroups.com

- 嗯嗯嗯,小黄出没了!! 最近想用 haskell 实现个小的 api 服务有问题,随时吼哈!
- 这种形式化的表述已经忘記了,开始回忆,,


a -> b -> c  <=>  a -> (b -> c)

意思是?
- 一个 接收两个 a,b 参数 输出一个值 的函式
- 等价于 接收一个参数a 输出一个新的函式 该函式接收 一个参数 b 输出一个值 c
是也乎?!
所以 \acc x -> acc + x
即:


a -> b -> c

等于
((+ a)b)

a -> ( b -> c )

yi huang

unread,
Feb 23, 2012, 11:51:31 PM2/23/12
to haske...@googlegroups.com
是的,就是任意一个函数

f a b c 等价于 ((f a) b) c

如果把函数调用本身看作是有一个隐形的操作符的话,这个操作符是左结合的。
所以存在另一个操作符 $ ,它也是函数调用的,唯一的区别是他是右结合的。
 




--
人生苦短, Pythonic! 冗余不做,日子甭过!备份不做,十恶不赦!
俺: http://about.me/zoom.quiet
文字协议: http://creativecommons.org/licenses/by-sa/2.5/cn/



--
http://www.yi-programmer.com/blog/

Zoom.Quiet

unread,
Feb 23, 2012, 11:53:21 PM2/23/12
to yi.cod...@gmail.com, haske...@googlegroups.com

- 回到了方程式的結合律年代,,,
- 继续理解ing..

Reply all
Reply to author
Forward
0 new messages