代码之家  ›  专栏  ›  技术社区  ›  natemcintosh

对lambda函数中的字符串方法求反会产生错误

  •  0
  • natemcintosh  · 技术社区  · 5 年前

    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
    

    2 回复  |  直到 5 年前
        1
  •  2
  •   Tomas Petricek    5 年前

    您只需要在 not

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

    如果没有括号,编译器会将您的代码解释为调用

    not (line.Contains) ("abbr.")
    
        2
  •  1
  •   Fyodor Soikin    5 年前

    F.*语法不是C语言(或C,或C++,或Java)

    使用括号传递函数参数。相反,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."
    

    现在清楚了吗?看起来你想打电话给 line.Contains ,第二个参数是 "abbr."

    这不是你的意思,对吧?你的意思可能是先打个电话 行。包含 传递它 "abbr " 作为参数,然后将结果传递给

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

    not (line.Contains "abbr.")
    

    或者,您可以使用operator <| ,这是专门为这类事情准备的。它只是把一个参数传递给一个函数,所以几乎什么都不做。但它的重点是它是一个运算符,所以它的优先级低于函数调用:

    not <| line.Cobtains "abbr."