molti punti di vista, ecco la mia:
Possiamo pensare a tutti map
funzioni/metodi come casi specifici di Haskell di fmap
di Functors. Da quella definizione possiamo supporre che la struttura sarà preservata (più alcune altre proprietà interessanti).
Ma in .NET non ci sono Typeclasses così possiamo definire map
over 'Funtori ristrette', la conseguenza è alcune Functor proprietà non saranno conservati, ma dal momento che non esiste un codice generico che saranno interessate l'impatto è limitato.
Quindi nulla ci impedisce di definire map
sopra:
- Sets (limitazione: la funzione deve essere 'a ->' b quando 'una e' b: Confronto e dovrebbe essere injective)
- Strings (limitazione: la funzione dovrebbe essere caratte-> char)
- nullables (limitazione: la funzione dovrebbe essere 'a ->' b dove 'b non è un tipo di riferimento)
si noti che in s Alcuni casi ci sono restrizioni sia a livello di tipo che a livello di valore, ad esempio per impostare la restrizione a livello di tipo è entrambi i tipi 'a e' b devono avere confronto mentre la restrizione sul valore della funzione è che la funzione deve essere injective.
Se la lingua è in grado di esprimere i vincoli di livello del tipo, il compilatore genera un errore quando questi requisiti non sono soddisfatti.
Per i valori delle funzioni non ci sono restrizioni in fase di compilazione, anche se possiamo creare test di unità se vogliamo assicurarci che siano corretti. Ma cosa succederebbe se non ci preoccupassimo di limitare queste funzioni?
Bene, a condizione che comprendiamo che alcune proprietà di Functor non verranno rispettate, non c'è niente di sbagliato nell'usare una mappa su un numero limitato Functor.
Così possiamo definire un map
su strutture come liste ordinate, naturalmente, non si può supporre che map a >> map b
sarà sempre equivalente a map (a >> b)
in questi casi. La restrizione qui è che la funzione dovrebbe essere monotonically increasing.
NOTA: per Haskell c'è una package con un funtore limitato e un'istanza per i set di
Tutte le risposte hanno davvero aiutato, ma penso che questo sia il più chiaro. Mi stavo definitivamente confondendo equipaggiando le funzioni della mappa F # con la mappa del functor Haskell. – Akash