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.
Minor miglioramento 'Seq.mapi (fun ab -> a, b)' –
@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
Inoltre, '||>' è il contrario dell'operatore che si desidera. –