诸如 Haskell 之类的语言的好处(它在 F# 中非常相似,但我不知道确切的语法——这应该有助于你理解——不过)是你可以只应用部分参数,创建 curried 函数:
adder n x y = n + x + y
换句话说:“给我三样东西,我会把它们加在一起”。当你向它抛出数字时,编译器将推断 n x 和 y 的类型。说你写
adder 1 2 3
1、2 和 3 的类型是 Int。因此:
adder :: Int -> Int -> Int -> Int
也就是说,给我三个整数,我最终会变成一个整数,还是和说的一样:
five :: Int
five = 5
但是,这里是不错的部分!试试这个:
add5 = adder 5
您还记得,adder 接受一个 int、一个 int、一个 int,然后返回一个 int。然而,这并不是全部真相,您很快就会看到。其实add5会有这种类型:
add5 :: Int -> Int -> Int
这就好像你已经“剥离”了整数(最左边的),并将它直接粘在函数上。仔细观察函数签名,我们注意到 -> 是右关联的,即:
addder :: Int -> (Int -> (Int -> Int))
这应该很清楚:当你给加法器第一个整数时,它会计算第一个箭头右边的任何东西,或者:
add5andtwomore :: Int -> (Int -> Int)
add5andtwomore = adder 5
现在您可以使用 add5andtwomore 代替“adder 5”。这样,您可以应用另一个整数来获取(比如说)“add5and7andonemore”:
add5and7andonemore :: Int -> Int
add5and7andonemore = adder 5 7
如你所见,add5and7andonemore 正好需要另一个参数,当你给它一个时,它会突然变成一个整数!
> add5and7andonemore 9
=> ((add5andtwomore) 7) 9
=> ((adder 5) 7) 9)
<=> adder 5 7 9
将参数加法器 (n x y) 代入 (5 7 9),我们得到:
> adder 5 7 9 = 5 + 7 + 9
=> 5 + 7 + 9
=> 21
其实,plus也只是一个函数,它接受一个int,然后给你另一个int,所以上面真的更像:
> 5 + 7 + 9
=> (+ 5 (+ 7 9))
=> (+ 5 16)
=> 21
给你!