Haskell学习笔记:Lambda函数&局部应用与局部套用(Currying and partial application)
程序员文章站
2024-01-29 19:32:46
...
Haskell学习与翻译笔记:Lambda函数&柯里化与偏函数应用(Currying and partial application)
Lambda函数
- 下列两个函数定义是相同的:
inc x = x + 1
inc2 = \x -> x + 1
-
那么区别在哪呢?
\x -> x + 1 表示一个未命名函数(annonymous functions) -
Lambda abstraction语法:
\x -> … -
下列两个函数定义也大致相同
f x y = x + y
g = \x -> \y -> x + y
柯里化与偏函数应用(Currying and partial application)
- 下述两个函数有什么区别呢?
g = \x -> \y -> x + y
h (x,y) = x + y
answer:函数h是未柯里化的函数g
其中:函数g为单变量x函数,先作为函数\y -> x + y 的变量。其次y再作为函数x+y变量;函数h则为多变量函数,认为所有的变量都由一个数组集合给出。
- 通过简单的操作可以简单的将单变量函数与多变量函数互相转换,这个过程就叫做(去)柯里化(un)currying。
curry :: ((a, b) -> c) -> a -> b -> c
curry f = \x -> \y -> f (x,y)
uncurry :: (a -> b -> c) -> (a, b) -> c
uncurry f = \(x,y) -> f x y
注:类型说明是可忽略的,因为Haskell自带类型推断环节(type inference)。
函数顺序从左至右,类型说明从右至左。
- 从用户的角度来说,最好从“柯里化”的角度定义一个函数,如下:
apply = \f -> \x -> f x
plus = \x -> \y -> x + y
inc = apply (plus 1)
然而,未柯里化的函数开销更小(less overhead)且通常更有效率,因为可避免偏函数应用与匿名函数的情况。(partial function application and closures can be avoided)
- 在这里我们看到,函数是Haskell里最重要的,且函数可以被部分应用。
Functions are first-class, functions can be applied partially.