# [译] 准备充分了嘛就想学函数式编程？(Part 5)

2016-11-10

#### 引用透明

``````y = x + 10
``````

``````x = 3
``````

``````y = 3 + 10
``````

``````quote str =
"'" ++ str ++ "'"
``````

``````findError key =
"Unable to find " ++ (quote key)
``````

``````findError key =
"Unable to find " ++ ("'" ++ str ++ "'")
``````

#### 执行顺序

``````1. 拿出面包
2. 将两片面包放入吐司机
3. 选择焦脆程度
4. 压下控制杆
5. 等待弹出吐司
6. 移走吐司
7. 拿出黄油
8. 拿切黄油的刀
9. 将黄油在吐司上涂匀
``````

``````线程 1
--------
1. 拿出面包
2. 将两片面包放入吐司机
3. 选择焦脆程度
4. 压下控制杆
5. 等待弹出吐司
6. 移走吐司

--------
1. 拿出黄油
2. 拿切黄油的刀
3. 等待线程 1 完成
4. 将黄油在吐司上涂匀
``````

``````buildMessage message value =
let
upperMessage =
String.toUpper message

quotedValue =
"'" ++ value "'"

in
upperMessage ++ ": " ++ value
``````

#### 类型标注

``````public static String quote(String str) {
return "'" + str + "'";
}
``````

``````private final Map getPerson(Map people, Integer personId) {
// ...
}
``````

``````var getPerson = function(people, personId) {
// ...
};
``````

``````add : Int -> Int -> Int
x + y
``````

``````add : Int -> (Int -> Int)
``````

``````doSomething : String -> (Int -> (String -> String))
doSomething prefix value suffix =
prefix ++ (toString value) ++ suffix
``````

``````doSomething : String -> Int -> String -> String
``````

``````takes2Params : Int -> Int -> String
takes2Params num1 num2 =
-- do something
``````

``````takes1Param : (Int -> Int) -> String
takes1Param f =
-- do something
``````

takes2Param 是一个需要两个参数的函数，一个 Int 参数和另一个 Int 参数。然而， takes1Param 需要一个参数，即一个接收 Int 和返回 一个 Int 的函数。

``````map : (a -> b) -> List a -> List b
map f list =
// ...
``````

I如果你看到 (a -> a)， 那就意味着输入类型和输出类型 必须 是一样的。它们是什么不重要，但是它们必须匹配。

``````(Int -> String) -> List Int -> List String
``````

List Int 类型指的是一个 Int 列表， List String 类型指的是一个 String 列表。如果你用过 Java 或其他语言里的范型，那么这个概念你应该熟悉。