我最近开始学习 F# 并遇到了一些简单示例的 curried 函数,例如:
考虑一个函数,它通过将价格乘以p
售出的单位数来计算销售额n
。
let sales (p,n) = p * (float n);;
该函数的类型为
val sales : p:float * n:int -> float
即取一对float
andint
并返回 a float
。
我们可以把它写成一个柯里化函数
let salesHi p n = p * (float n);;
该函数的类型为
val salesHi : p:float -> n:int -> float
即接受 afloat
并返回to的函数。int
float
在简单的情况下,这似乎没有什么区别
sales (0.99, 100);;
salesHi 0.99 100;;
两者都给
val it : float = 99.0
但是,使用 curried 函数,我可以输入特定项目的价格以获得新功能。例如
let salesBeer = salesHi 5.99;;
let salesWine = salesHi 14.99;;
然后salesBeer 2
给11.98
和salesWine 2
给29.98
。
另外,我注意到内置运算符如+
被定义为函数,因此我可以编写,例如:
let plus2 = (+) 2;
List.map plus2 [1;3;-1];;
并得到
val it : int list = [3; 5; 1]
这似乎是件好事。因此,当我想用带有参数的命令式语言实现一个函数时,我是否n > 1
应该总是在 F# 中使用柯里化函数(只要参数是独立的)?n
或者我应该采取简单的路线并在必要时使用带有 -tuple 的常规函数并稍后使用 curry?或者是其他东西?
F# 程序员如何决定何时以柯里化形式创建函数或使用带有元组的常规函数?