欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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.
相关标签: Haskell