L'operatore che hai descritto è essenzialmente la funzione map
per una tupla a due elementi. La funzione map
, in generale, ha una firma (per alcuni F<'a>
che potrebbe essere seq<'a>
o molti altri tipi in F # librerie):
map : ('a -> 'b) -> F<'a> -> F<'b>
Quindi, se si definisce F<'a>
come una tupla di due elementi, quindi la funzione è in realtà basta map
(se lanciate gli argomenti):
type F<'a> = 'a * 'a
let map f (a, b) = (f a, f b)
l'operazione non è integrato in qualsiasi parte del libreria F #, ma è utile per rendersi conto che in realtà corrisponde a un modello che è abbastanza comune in F # librerie altrove (lista, seq, array, ecc.)
Guardando la risposta Haskell fa riferimento @pad - in linea di principio, Haskell permette di definire la stessa funzione per tutti i tipi che supportano tali operazioni utilizzando classi di tipo (quindi si può scrivere solo fmap
invece di Seq.map
o al posto del tuo TwoElementTuple.map
, ma in realtà non funziona per vari motivi tecnici, quindi gli Haskeller devono chiamarlo in modo diverso).
in F #, questo non è facilmente possibile definire una singola funzione map
per i diversi tipi, ma si può ancora pensare alla vostra funzione di map
per due elementi tuple (anche se si trovano più facile per dare un simbolico nome dell'operatore, anziché il nome map
.)
fonte
2013-02-07 10:41:48
Bella osservazione, prendo in considerazione la possibilità di rinominarlo in 'map' ... ma devo ammettere che mi piace la semantica del piping .. – Benjol
Penso che usare il nome simbolico qui sia probabilmente più bello - Dipende davvero dal tuo uso specifico. (Ma io non sono un grande fan dei nomi simbolici, in generale, perché li trovo più difficili da decifrare). –