2013-02-09 11 views
6

Dato una stringa di cifre, mi piacerebbe avere una sequenza di tuple che mappano i caratteri diversi da zero con la loro posizione nella stringa. Esempio:Esiste una funzione o un operatore di libreria per creare una tupla?

IN: "000140201" 
OUT: { (3, '1'); (4, '4'); (6, '2'); (8, '1') } 

Soluzione:

let tuples = source 
      |> Seq.mapi (fun i -> fun c -> (i, c)) 
      |> Seq.filter (snd >> (<>) '0') 

Sembra (fun i -> fun c -> (i, c)) è molto di più di battitura di quanto dovrebbe essere per un'operazione così semplice e presumibilmente comune. È facile da dichiarare la funzione necessaria:

let makeTuple a b = (a, b) 
let tuples2 = source 
       |> Seq.mapi makeTuple 
       |> Seq.filter (snd >> (<>) '0') 

Ma mi sembra che se la libreria fornisce la funzione snd, dovrebbe anche fornire la funzione makeTuple (e probabilmente con un nome più breve), o almeno dovrebbe essere relativamente facile da comporre. Non riuscivo a trovarlo; mi sto perdendo qualcosa? Ho provato a creare qualcosa con il framework Tuple.Create, ma non sono riuscito a capire come ottenere qualcosa di diverso dal sovraccarico a argomento singolo.

+5

Minor miglioramento 'Seq.mapi (fun ab -> a, b)' –

+0

@JohnPalmer ah, grazie.Ho pensato di avere un errore con quella sintassi in precedenza, ma suppongo che l'errore sia stato causato da qualcos'altro. – phoog

+1

Inoltre, '||>' è il contrario dell'operatore che si desidera. –

risposta

7

Ma mi sembra che se la libreria fornisce la funzione snd, dovrebbe anche fornire la funzione makeTuple.

F # presuppone che si decompongono tuple (utilizzando fst, snd) molto più spesso di loro composizione. Il design della libreria funzionale segue spesso il principio minimo. Basta fornire funzioni per casi di uso comune, altre funzioni dovrebbero essere facili da definire.

Non riuscivo a trovarlo; mi sto perdendo qualcosa?

No, non lo sei. E 'la stessa ragione per cui FSharpx ha definito tuple2, tuple3, ecc Qui ci sono funzioni di utilità direttamente dal Prelude:

/// Creates a pair 
let inline tuple2 a b = a,b 
/// Creates a 3-tuple 
let inline tuple3 a b c = a,b,c 
/// Creates a 4-tuple 
let inline tuple4 a b c d = a,b,c,d 
/// Creates a 5-tuple 
let inline tuple5 a b c d e = a,b,c,d,e 
/// Creates a 6-tuple 
let inline tuple6 a b c d e f = a,b,c,d,e,f 

ho cercato di costruire qualcosa con Tuple.Create del quadro, ma non riuscivo a capire come ottenere qualcosa di diverso dal sovraccarico a argomento singolo.

Il compilatore F # nasconde le proprietà di System.Tuple<'T1, 'T2> per applicare l'idioma di corrispondenza del modello sulle tuple. Vedi Extension methods for F# tuples per maggiori dettagli.

Detto questo, lo stile point-free non è sempre consigliato in F #. Se ti piace il point-free, devi fare un po 'di sollievo.

2

La risposta @ del pad è grande, solo per aggiungere i miei 2 centesimi: Sto usando simile operatore

let inline (-&-) a b = (a, b) 

e sembra molto conveniente scrivere let x = a -&- b

Forse troverete questo operatore utile anche

Problemi correlati