Кто-нибудь знает, есть ли встроенная функция для чтения с консоли аналогично функции printfn
?
Единственный метод, который я видел до сих пор, - это использовать System.Console.Read()
, но он не чувствует себя так же функционально, как использование такой конструкции, как printfn
.
Чтение с консоли в F #
Ответ 1
Поистине стыдно, что такой встроенной функции нет. Однако, как сказал Брайан в комментарии к ответу Бенджоля, можно построить функцию 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"
Ответ 2
Насколько я знаю, нет.
Было бы удобно для кода golf:)
Ответ 3
Комбинация TryParse() и split/regex - это то, что вы можете использовать "из коробки".
P.S. я видел http://www.codeproject.com/KB/recipes/csscanf.aspx, и он работает;)