函数的补充语法
柯里化
将一个多参数的函数转化为一个新的函数
这个新的函数接受一个参数并返回另一个函数,这个返回的函数等待下一个参数
这个过程可以继续,直到所有参数都被接受
这样,通过柯里化,一个多参数的函数可以被转化为一系列单参数函数
例如,考虑以下非柯里化函数:
柯里化后:
用Js可以这么实现
function add(a){
return function(b){
return a + b;
}
}
Haskell中所有函数默认柯里化
所以可以这么写
add x y z = x + y + z
addFive :: Int -> Int -> Int
addFive = add 5
addFiveAndThree :: Int -> Int
addFiveAndThree = addFive 3
n = addFiveAndThree 2 -- 结果是 10
高阶函数
返回函数或者以函数作为参数 的函数
例子
applyTwice :: (a -> a) -> a -> a -- 函数作为参数
applyTwice f x = f (f x) -- 返回函数
zip
拉链
两个长度相等的列表位置一一对应
位置相同的两个值执行某个处理函数成为新值
新值组成一个新的列表
一般来说这个处理函数是把两个值合并成一个元组
main = do
let list1 = [1, 2, 3]
let list2 = [4, 5, 6]
print (zip list1 list2) -- 结果是[(1,4),(2,5),(3,6)]
print (zipWith (+) list1 list2) -- 用自定义的处理函数,结果是[5,7,9]
匿名函数
\arguments -> expression
匿名函数在 Haskell 中使用反斜线(\)开始,后跟参数列表,然后是 -> 和函数体
\x y -> x + y
n = (\x y -> x + y) 1 2 -- 结果是 3
Point free
两函数如果所有输入对应的输出都一一对应且相等
则这两个函数相等
g x = f x -- 这是一般的绑定方式
g = f -- 这是point free的绑定方式
g x = f -- 这样也行
g x = f x y -- 这样也行
g x y = f y -- 这样也行