`
pf_miles
  • 浏览: 134172 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

《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]


函数组合其实就是高中、大学里学的复合函数

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

如果想要把一个嵌套了很多层括号的式子转变成函数复合的写法,只需将最“里面”的那个函数的最后一个参数用'$'格在右边,其它部分按照一层嵌套一个'.'符的形式改写,比如有:
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里面该怎么写...
(我写了一种嵌套使用'`'符号的方式结果报语法错误...)
分享到:
评论
1 楼 pf_miles 2010-01-21  
"对一个接受3个参数的函数首先传入它的第三个参数"貌似有答案了:
http://www.douban.com/group/topic/9537847/

相关推荐

Global site tag (gtag.js) - Google Analytics