# First-class functions
## 1、Functions as arguments
函数作为参数,先看以下示例:
```haskell
ifEvenInc n = if even n
then n + 1
else n
```
ifEvenInc函数有一个参数n,如果n是even,则函数返回n+1,否则返回n,很简单,测试一下:

我们再写几个类似的函数
```haskell
ifEvenDouble n = if even n
then n * 2
else n
ifEvenSquare n = if even n
then n ^ 2
else n
这些个函数其实都是一个模式,都是判断参数n是不是even,如果是则进行“**某种操作**”,否则直接返回n,我们抽象一个这种模式,将这“某种操作”是不是可以抽象成一个function,然后重新梳理以下这类函数的模式,参数n如果是even, 我们就function n,否则返回n,然后就是这种形式了
```haskell
ifEven myFunc n = if even n
then myFunc n
else n
这个myFunc 可以是 inc n = n + 1 , double n = n * 2, square n = n ^ 2等等等,测试一下这个是否可行:
事实证明,这个完全是可行的,那么我们是不是可以推广一下这个函数,其实n → n也是一个函数
ifEven1 myFunc1 myFunc2 n = if even n
then myFunc1 n
else myFunc2 n
我们已深入探讨了将函数作为参数传递(passing functions as arguments)的诸多应用,但这仅展现了一等函数(first-class functions)作为值的能力之半壁。函数亦可返回值,因此真正的"一等公民"函数,必然包含返回其他函数(return other functions)的能力。此时开发者不禁要问:为何需要返回函数呢? 一个典型场景是——基于特定参数动态分派函数(dispatch functions)。
PO Box 1234,San Francisco,CA,94111
PO Box 789,New York,NY,10013
PO Box 456,Reno,NV,89523
您需要构建一个函数,该函数将接受一个名称tuple(如您之前在排序示例中使用的那样) 和一个办公室位置,然后为您整理邮件地址。此函数的第一遍可能如下所示。我们需要介绍的唯一一件你还没有看到的事情是用于连接字符串 (和列表) 的++运算符。