2013-02-07 11 views

risposta

4

No, non è così.

Tuttavia, si incontrerà la sua variante molto spesso se si utilizza FParsec. Ecco la firma di tipo nella documentazione FParsec:

val (|>>): Parser<'a,'u> -> ('a -> 'b) -> Parser<'b,'u> 

penso che la biblioteca ha un insieme molto ben progettato di operatori che possono essere generalizzate per altri scopi. L'elenco degli operatori di FParsec può essere trovato here.

Ho fatto un po 'di scavo; L'operatore |>> non sembra avere built-in Haskell counterpart sebbene sia facile da definire utilizzando Control.Arrow.

3

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.)

+0

Bella osservazione, prendo in considerazione la possibilità di rinominarlo in 'map' ... ma devo ammettere che mi piace la semantica del piping .. – Benjol

+1

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). –

Problemi correlati