【问题标题】:Trouble with String.split in F#F# 中的 String.split 问题
【发布时间】:2011-09-26 15:26:30
【问题描述】:

以下代码有问题,我正在尝试构建词法分析器。

我再次使用 F# for Scientists 中的示例。

    let lines_of_file filename =
       seq { use stream = File.OpenRead filename
             use reader = new StreamReader(stream)
             while not reader.EndOfStream do
             yield reader.ReadLine() };;

    let read_matrix filename =
      lines_of_file filename
      |> Seq.map (String.split [' '])
      |> Seq.map (Seq.map float)
      |> Math.Matrix.of_seq;;

我声明了以下命名空间:-

          open System
          open System.IO
          open System.Runtime.Serialization.Formatters.Binary
          open Microsoft.FSharp.Core

但在 read_matrix 函数中,“Split.string”中的“split”未被识别。智能感知也不识别“矩阵”。

我尝试过声明很多命名空间以查看它们是否能够识别该方法,但没有任何效果(我的智能感知器甚至无法识别 System.Math)。

如果这是一个愚蠢的问题,我深表歉意,我已经查看了整个 MSDN 和其他地方,但找不到任何东西。

谁能帮我让VS识别“分裂”和“矩阵”?

非常感谢。

【问题讨论】:

    标签: string f# lexer


    【解决方案1】:

    有几个问题。你的外壳是错误的。这是Split,而不是split。这是一个实例(非静态)方法。分隔符必须是数组,而不是列表。以下作品:

    let read_matrix filename =
      lines_of_file filename
      |> Seq.map (fun line -> line.Split ' ')
      |> Seq.map (Seq.map float)
      |> Math.Matrix.ofSeq
    

    顺便提一下,Math.Matrix.of_seq 已被弃用。现在是Math.Matrix.ofSeq

    【讨论】:

    • 我试过了,然后它告诉我“Split”不是静态方法。
    • 我尝试了很多案例等,试图让它发挥作用。不过感谢您的建议。
    • 好的,你在我最初的 cmets 之后编辑了你的答案。但是感谢您提供了很棒的工作代码。
    • 小挑剔:您可以将 Split 调用编写为“line.Split(' ')”,就好像它将字符作为参数而不是字符数组一样。数组参数在 C# 文档中列为“params”参数,因此附加了 ParamArrayAttribute。 F# 也尊重该属性(并在幕后为您构建数组)
    【解决方案2】:

    为了让实例方法在 F# 中更自然地使用,一个常见的做法是定义简单的辅助函数:

    let split separators (x:string) = x.Split(separators)
    // Can now pipe into it:
    lines_of_file filename
    |> Seq.map (split [|' '|])
    

    【讨论】:

      【解决方案3】:

      也适用于拆分问题..拆分是字符串实例上的方法..您不能像以前那样将其称为静态方法..

      例如:“某个字符串值”.Split([|' '|]) 是拆分将分隔符列表作为数组传递的字符串的正确方法

      【讨论】:

      • 您应该编辑您的第一个答案以添加此新信息,然后将其标记为删除。
      【解决方案4】:

      至于Math.Matrix方法,是来自f# powerpack,需要安装...

      你可以阅读这个 Stackoverflow 线程.. what-happened-to-microsoft-fsharp-math-matrix

      也适用于拆分问题..拆分是字符串实例上的方法..您不能像以前那样将其称为静态方法..

      ex: "Some string value".Split([|' '|]) 是拆分字符串的正确方法,将分隔符列表作为数组传递

      【讨论】:

      • 谢谢你,我在安装电源组后得到了矩阵功能,如果我也能给你一个绿色的勾,我会的! :)
      猜你喜欢
      • 2013-05-25
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多