F#中的String.split问题

Sim*_*ard 2 string f# lexer

我在使用以下代码时遇到问题,我正在尝试构建一个词法分析器.

我再次使用F#中的科学家的例子.

    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;;
Run Code Online (Sandbox Code Playgroud)

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

          open System
          open System.IO
          open System.Runtime.Serialization.Formatters.Binary
          open Microsoft.FSharp.Core
Run Code Online (Sandbox Code Playgroud)

但是在read_matrix函数中,"Split.string"中的"split"无法识别.intellisense也不识别"矩阵".

我已经尝试声明了很多名称空间以查看它们是否识别该方法,但没有任何作用(我的intellisense甚至不识别System.Math).

我很抱歉,如果这是一个愚蠢的问题,我已经看过MSDN和其他地方,但我找不到任何东西.

任何人都可以帮助我让VS识别"分裂"和"矩阵"吗?

非常感谢.

Dan*_*iel 7

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

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

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

  • 小挑剔:您可以将对Split的调用写为"line.Split('')",就好像它将一个字符作为参数而不是一个字符数组.数组参数在C#文档中列为'params'参数,因此附加了ParamArrayAttribute.F#也尊重该属性(并在幕后为您构建数组) (2认同)

Rob*_*sen 5

在F#中使实例方法更自然的常见做法是定义简单的辅助函数:

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