开发者

Trouble with String.split in F#

开发者 https://www.devze.com 2023-04-07 10:08 出处:网络
I am having trouble with the following code, I am trying to build a lexer. Again I am using the examples from F# for Scientists.

I am having trouble with the following code, I am trying to build a lexer.

Again I am using the examples from 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;;

I have the following namespaces declared:-

          open System
          open System.IO
          open System.Runtime.Serialization.Formatters.Bina开发者_如何学运维ry
          open Microsoft.FSharp.Core

But in the read_matrix function the "split" in "Split.string" is not recognised. Also the intellisense does not recognise "Matrix".

I have tried declaring a lot of namespaces to see if they recognise the method, but nothing works (my intellisense does not even recognise System.Math).

I apologise if this is a stupid question, I have looked all over MSDN and elsewhere but I could not find anything.

Can anyone help me to get VS to recognise "split" and "Matrix"?

Many thanks.


There are a few problems. Your casing is wrong. It's Split, not split. It's an instance (not static) method. The separators must be an array, not list. The following works:

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

Incidentally, Math.Matrix.of_seq has been deprecated. It is now Math.Matrix.ofSeq.


A common thing to do to make instance methods more natural to use in F# is to define simple helper functions:

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


Also for the Split issue.. Split is a method on a string instance.. You can not call it as a static method as you did..

ex: "Some string value".Split([|' '|]) is a correct approach to split a string passing the list of delimiters as an array


As for the Math.Matrix method, it is from the f# powerpack that you need to install...

you can read this Stackoverflow thread.. what-happened-to-microsoft-fsharp-math-matrix

Also for the Split issue.. Split is a method on a string instance.. You can not call it as a static method as you did..

ex: "Some string value".Split([|' '|]) is a correct approach to split a string passing the list of delimiters as an array

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号