【发布时间】:2009-11-30 02:57:32
【问题描述】:
您能否只使用部分应用的运算符来传递“除以 2”或“减 1”之类的运算,其中“加 1”如下所示:
List.map ((+) 1) [1..5];; //equals [2..6]
// instead of having to write: List.map (fun x-> x+1) [1..5]
正在发生的事情是 1 被应用到 (+) 作为它的第一个参数,而列表项被应用作为第二个参数。对于加法和乘法,这个参数顺序无关紧要。
假设我想从每个元素中减去 1(这可能是初学者的常见错误):
List.map ((-) 1) [1..5];; //equals [0 .. -4], the opposite of what we wanted
1 应用于 (-) 作为它的第一个参数,所以我得到 (1 - list_item) 而不是 (list_item - 1)。我可以将其重写为加负数而不是减去正数:
List.map ((+) -1) [1..5];;
List.map (fun x -> x-1) [1..5];; // this works too
我正在寻找一种更具表现力的方式来编写它,例如((-) _ 1),其中_ 表示一个占位符,就像在 Arc 语言中一样。这将导致1 成为- 的第二个参数,因此在List.map 中,它将评估为list_item - 1。所以如果你想将divide by 2 映射到列表中,你可以这样写:
List.map ((/) _ 2) [2;4;6] //not real syntax, but would equal [1;2;3]
List.map (fun x -> x/2) [2;4;6] //real syntax equivalent of the above
可以这样做还是我必须使用(fun x -> x/2)?似乎最接近占位符语法的方法是使用带有命名参数的 lambda。
【问题讨论】:
标签: f# operators partial-application