《Learn You a Haskell for Great Good!》读书笔记(二)

看了5、6两章,笔记在这里~
首先是currying:
值得一提的是——接受两个参数的前缀函数如果先传入第二个参数...
let elemOf123 = (`elem` [1,2,3])


内置函数:
flip,map,filter,takeWhile,foldl,foldr,foldl1,foldr1,scanl,scanr,scanl1,scanr1


lambdas are expressions——它创造出一个值——匿名函数

优先使用现有内置函数,利用currying进行partial application构造需要的函数而非轻易使用lambda(或者使用函数复合制造需要的函数),总之,在需要一个非内置函数的时候,尽量走create on the fly的门路而非lambda

folds有点像reduce

$是方法应用的另一种形式,但具有最低运算优先级,且是右结合的

$除了可以用来省略一些括号之外,其本身也是一个function,感觉这一点具有重要意义,这极大地统一了haskell程序运行的规律:
map ($ 3) [(4+), (10*), (^2), sqrt]


函数组合其实就是高中、大学里学的[url=http://en.wikipedia.org/wiki/Function_composition]复合函数[/url]

函数想要复合,条件当然是“牛头要对马嘴”了...

如果想要把一个嵌套了很多层括号的式子转变成函数复合的写法,只需将最“里面”的那个函数的最后一个参数用'$'格在右边,其它部分按照一层嵌套一个'.'符的形式改写,比如有:
replicate 100 (product (map (*3) (zipWith max [1,2,3,4,5] [4,5,6,7,8])))

可以改写为:
replicate 100 . product . map (*3) . zipWith max [1,2,3,4,5] $ [4,5,6,7,8]


函数复合有助于写出"pointless"风格的函数定义,比如:
fn x = ceiling (negate (tan (cos (max 50 x))))

可以写成:
fn = ceiling . negate . tan . cos . max 50

也就是说,变成函数复合的写法后,由于currying,两边的'x'“约掉了”...
============================
...还有一个问题需要想想:说到currying,怎样才能对一个接受3个参数的函数首先传入它的第三个参数呢?如果说haskell的函数和数学函数类似的话,数学函数先代入第三个参数也是很合理的事情,不知道haskell里面该怎么写...
(我写了一种嵌套使用'`'符号的方式结果报语法错误...)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值