Читайте из консоли в F#

Делает любой знает, существует ли встроенная функция для чтения из консоли аналогично к printfn функция? Единственный метод, который я видел до сих пор, использует System.Console.Read() но это не чувствует себя столь же функциональным как использование конструкции как printfn .

14
задан Aurril 10 March 2010 в 09:23
поделиться

3 ответа

Очень жаль, что нет такой встроенной функции. Однако, как упомянул Брайан в комментарии к ответу Бенджола, можно самостоятельно создать функцию 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"
17
ответ дан 1 December 2019 в 13:21
поделиться

Насколько мне известно, нет.

Это было бы удобно для кода гольфа :)

1
ответ дан 1 December 2019 в 13:21
поделиться

Комбинация TryParse() и split/regex - это то, что вы можете использовать "из коробки".

P.S. Я видел http://www.codeproject.com/KB/recipes/csscanf.aspx и это работает ;)

1
ответ дан 1 December 2019 в 13:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: