2010-03-10 10 views
13

Qualcuno sa se esiste una funzione incorporata per la lettura dalla console allo stesso modo della funzione printfn? L'unico metodo che ho visto finora è l'utilizzo di System.Console.Read() ma non sembra funzionale quanto l'utilizzo di un costrutto come printfn.Lettura da Console in F #

risposta

16

È davvero un peccato che non ci sia tale funzione integrata. Tuttavia, come Brian ha menzionato in un commento sulla risposta di Benjol, è possibile creare autonomamente una funzione scanf. Ecco un rapido schizzo di come si potrebbe definire una variante sscanf, anche se solo %s segnaposti sono implementate:

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" 
+7

Quando avevo bisogno di un più completo versione di 'sscanf', è stato abbastanza facile estendere questo codice. Guarda il risultato qui: http://fssnip.net/4I – wmeyer

+0

@wmeyer - È fantastico! – kvb

+0

@wmeyer: sareste interessati a contribuire a FSharpx? https://github.com/fsharp/fsharpx –

1

Per quanto ne so, no.

sarebbe utile per il codice di golf :)

+3

E 'un peccato che il 'funzione di printfn' si basa sulla magia del compilatore - non si poteva fare il proprio F #' sscanf "altrettanto bello. –

+4

Puoi farlo, credo. L'unica magia è che i letterali stringa possono essere forzati a PrintfFormats, a quel punto i tipi sono manifest: let pf(): PrintfFormat <_, _, _, _> = "% d% s" – Brian