当前位置:  开发笔记 > 编程语言 > 正文

F#将带参数的运算符传递给函数

如何解决《F#将带参数的运算符传递给函数》经验,为你挑选了3个好方法。

你可以使用部分应用的运算符传递"除以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被应用于( - )作为它的第一个参数,所以不是(list_item - 1),我得到(1 - list_item).我可以将其重写为添加负数而不是减去正数:

List.map ((+) -1) [1..5];;
List.map (fun x -> x-1) [1..5];; // this works too

我正在寻找一种更具表现力的方式来编写它,例如((-) _ 1),where _表示占位符,就像在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.



1> Logan Capald..:

你可以编写一个翻转函数,例如:

let flip f x y = f y x

List.map (flip (-) 1) [2;4;6]

我可能有错误的语法,我对F#不是很精通.


您的翻转功能(也可以)被定义为'let flip fxy = fyx'

2> Brian..:

F#,la Haskell中没有"操作部分",也没有占位符参数(显然是la Arc).您可以使用另一个答案中建议的"翻转"组合器来反转参数的顺序,然后部分应用第一个(现在是第二个)参数.

但我会用

fun x -> x / 2

除非你正在玩代码高尔夫,否则我不认为在这里试图刮掉另外几个角色会给你带来任何好处.



3> Johan Kullbo..:

flip所建议-溶液洛根CAPALDO也可以使用运营商(这里写的>.):

let (>.) x f = (fun y -> f y x)
List.map (1 >. (-)) [2;4;6]

或者如果你更喜欢操作数:

let (>.) f x = (fun y -> f y x)
List.map ((-) >. 1) [2;4;6]

编辑:使用"看起来更像占位符"的运算符(这里>-<)让您非常接近建议的语法:

List.map ((-) >-< 1) [2;4;6]

'_'不幸(?)不是F#中的有效运算符符号.

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有