Haskell中的curried function和higher-order function

柯里化函数(curried function)和高阶函数(higher-order function),两种特殊的函数,初学Haskell时可能因为不理解这些概念而感到迷惑,在此作简要介绍。

什么是curried function

柯里化函数:一种返回值是一个函数的函数

函数:

函数是一种映射,对于符合要求的任意自变量$x$,$fx$会返回一个对应的$y$(返回值);程序中的$x, y$往往有其固定的数据类型。

curried function:

本质上也是一种函数,可以理解为“返回值是一个函数的函数”;

定义一个函数

1
2
f :: Integer -> Integer -> Integer
f x y = x + y

由于Haskell中->是right-associative的,实际上第一句等效于

1
f :: Integer -> (Integer -> Integer)

所以这句程序相当于:

f 是一个函数,f 的唯一一个参数是 Integer类型的参数,在这里这一个参数是 x;

f 函数的返回值是一个函数,“这个函数”以 Integer为唯一参数,返回值是一个 Integer;

f x即上一行提到的“f 返回的那个函数”,这个函数接收参数 y 后,返回一个 Integer.

至此,整个函数结束。

使用时,f 2 3,过程应该理解为(f 2) 3

 

什么是higher-order function

高阶函数:一种以函数作为参数的函数

定义一个函数

1
2
twice :: (Integer -> Integer) -> Integer -> Integer
twice f x = f (f x)

第一句实际上等效于

1
twice :: (Integer -> Integer) -> (Integer -> Integer)

所以这句程序相当于:

twice 是一个函数,它的参数是一个Integer -> Integer的函数,它的返回值也是一个Integer -> Integer的函数;

f 在定义里面,是一个Integer -> Integer的函数,所以twice f这一过程已经完成了twice函数的工作,并且返回了一个Integer -> Integer的函数,“这个函数”以 x 作为参数,并且最终返回一个Integer.

至此,整个函数结束。

这个函数干了什么其实很好理解,比如假设f(x) = 2x + 1(伪代码),twice f 2就会输出11.


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!