看了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里面该怎么写...
(我写了一种嵌套使用'`'符号的方式结果报语法错误...)