我遇到以下代码时遇到问题,我正在尝试构建词法分析器。
我再次使用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识别“分裂”和“矩阵”吗?
非常感谢。
答案 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([|''|]) 是一个正确的方法来分割一个字符串作为数组传递分隔符列表