从F#中的控制台读取

Aur*_*ril 14 console f#

有没有人知道是否有一个内置函数从控制台读取同样的printfn功能?到目前为止我见过的唯一方法是使用System.Console.Read()它,但它不像使用像printfnis 这样的构造那样功能.

kvb*_*kvb 17

没有这样的内置功能确实令人遗憾.但是,正如Brian在对Benjol的回答中提到的那样,可以自己构建一个scanf函数.下面是一个如何定义sscanf变体的快速草图,尽管只%s实现了占位符:

open System
open System.Text
open System.Text.RegularExpressions
open Microsoft.FSharp.Reflection

let sscanf (pf:PrintfFormat<_,_,_,_,'t>) s : 't =
  let formatStr = pf.Value
  let constants = formatStr.Split([|"%s"|], StringSplitOptions.None)
  let regex = Regex("^" + String.Join("(.*?)", constants |> Array.map Regex.Escape) + "$")
  let matches = 
    regex.Match(s).Groups 
    |> Seq.cast<Group> 
    |> Seq.skip 1
    |> Seq.map (fun g -> g.Value |> box)
  FSharpValue.MakeTuple(matches |> Seq.toArray, typeof<'t>) :?> 't


let (a,b) = sscanf "(%s, %s)" "(A, B)"
let (x,y,z) = sscanf "%s-%s-%s" "test-this-string"
Run Code Online (Sandbox Code Playgroud)

  • 当我需要更完整版的`sscanf`时,扩展这段代码非常容易.在这里查看结果:http://fssnip.net/4I (8认同)
  • 快速修复:将最后一个`MakeTuple`行替换为:`if matches.Length = 1则匹配.[0] :?>'t; else FSharpValue.MakeTuple(matches,typeof <'t>):?>'t` (3认同)