【问题标题】:Negate a string method in a lambda function gives error否定 lambda 函数中的字符串方法会产生错误
【发布时间】:2020-01-17 22:35:48
【问题描述】:

我在 lambda 函数中调用字符串方法“包含”,并想否定它。我认为这可以用not myString.Contains("abbr") 完成,但它给了我错误

Successive arguments should be separated by spaces or tupled, and arguments involving function or method applications should be parenthesized

我的实际功能是这个

open System.IO

let createWordArray filePath =
    File.ReadLines(filePath)
    |> Seq.filter (fun line -> line <> "")
    |> Seq.filter (fun line -> not line.Contains("abbr.")) // Error occurs here
    |> Seq.map (fun line -> line.Split(' ').[0])
    |> Seq.filter (fun word -> word.StartsWith("-") || word.EndsWith("-"))
    |> Seq.toArray

请指出我犯的任何其他明显错误。

【问题讨论】:

    标签: f# f#-interactive


    【解决方案1】:

    您只需在 not 函数的参数周围添加括号:

    |> Seq.filter (fun line -> 
         not (line.Contains("abbr.")))
    

    如果没有括号,编译器会将您的代码解释为对 not 的调用,并带有两个参数:

    not (line.Contains) ("abbr.")
    

    【讨论】:

      【解决方案2】:

      F# 语法不同于 C#(或 C、C++ 或 Java)

      特别是,F#使用括号来传递函数参数。相反,F# 为此使用空格:

      let x = f y z
      

      当然,如果您想指示操作顺序,或者只是出于美观原因,您可以将任何术语括在括号中:

      let x = f (y+5) z // parens for order of operations
      let x = f (y) (z) // parens just for the heck of it
      

      所以你看,当你写的时候:

      line.Contains("abbr.")
      

      括号没有特殊含义。你也可以这样写:

      line.Contains "abbr."
      

      这将是等效的。

      看看发生了什么?还没有?好吧,好吧,让我们尝试将not 添加到组合中:

      not line.Contains "abbr."
      

      现在清楚了吗?这看起来像您正在尝试调用not 函数,并且您给它两个参数:第一个参数是line.Contains,第二个参数是"abbr."

      这不是你的意思,对吧?你的意思可能是首先调用line.Contains 将它传递给"abbr " 作为参数,然后将结果传递给not

      最直接的方法是使用括号来表示操作的顺序:

      not (line.Contains "abbr.")
      

      或者,您也可以使用运算符&lt;|,它专门用于此类事情。它只是将一个参数传递给一个函数,所以几乎什么都不做。但它的重点是它是一个运算符,所以它的优先级低于函数调用:

      not <| line.Cobtains "abbr."
      

      【讨论】:

      • 或者你可以写line.Contains "abbr." |&gt; not,我经常发现它更符合我们阅读英文文本的方式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-24
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 2021-11-26
      相关资源
      最近更新 更多