跳到主要内容

函数的补充语法

柯里化

将一个多参数的函数转化为一个新的函数
这个新的函数接受一个参数并返回另一个函数,这个返回的函数等待下一个参数
这个过程可以继续,直到所有参数都被接受
这样,通过柯里化,一个多参数的函数可以被转化为一系列单参数函数

例如,考虑以下非柯里化函数:

f(x,y,z)=x+y+zf(x,y,z) = x + y + z

柯里化后:

f(x)=g(y)=h(z)=x+y+zf(x) = g(y) = h(z) = x + y + z

用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 -- 这样也行