F#中的String.split问题

时间:2011-09-26 15:26:30

标签: 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;;

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

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

但是在read_matrix函数中,“Split.string”中的“split”无法识别。 intellisense也不承认“矩阵”。

我已经尝试声明了很多命名空间,看看他们是否认出了这个方法,但没有任何效果(我的intellisense甚至不识别System.Math)。

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

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

非常感谢。

4 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:1)

对于Math.Matrix方法,它来自您需要安装的f#powerpack ...

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

同样对于Split问题.. Split是字符串实例上的一个方法..你不能像你那样将它称为静态方法..

ex:“一些字符串值”.Split([|''|])是一种正确的方法来分割一个字符串,将分隔符列表作为数组传递

答案 3 :(得分:1)

同样对于Split问题.. Split是字符串实例上的一个方法..你不能像你那样将它称为静态方法..

ex:“某些字符串值”.Split([|''|])  是一个正确的方法来分割一个字符串作为数组传递分隔符列表