【问题标题】:F# passing an operator with arguments to a functionF# 将带参数的运算符传递给函数
【发布时间】: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


    【解决方案1】:

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

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

    我可能语法错误,我对 F# 不是很流利。

    【讨论】:

    • 您的翻转功能可以(同样)定义为“让翻转 f x y = f y x”
    【解决方案2】:

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

    但我会使用

    fun x -> x / 2
    

    除非你在玩代码高尔夫,否则我认为尝试在这里再剃掉几个角色对你没有任何好处。

    【讨论】:

      【解决方案3】:

      Logan Capaldo 建议的flip 解决方案也可以使用运算符编写(此处为>.):

      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]
      

      '_' 不幸的是(?)不是a valid operator symbol in F#

      【讨论】:

      • :) 笑脸。 :( 皱眉。:p 舌头。>-。一只眼睛伸出来。..(皱眉伸出一只眼睛。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 2015-02-16
      • 1970-01-01
      • 2016-01-16
      相关资源
      最近更新 更多