Sto lavorando alla sezione su Funcitors nel Typeclassopedia.Funcip e tipi non induttivi
Una semplice intuizione è che un Functor rappresenta un "contenitore" di qualche tipo, insieme alla possibilità di applicare una funzione in modo uniforme a ogni elemento nel contenitore.
OK. Quindi, i funtori appaiono piuttosto naturali per tipi induttivi come liste o alberi.
Anche i caratteri appaiono piuttosto semplici se il numero di elementi è fissato su un numero basso. Ad esempio, con Forse devi solo preoccuparti di "Nothing" o "Just a" - due cose.
Quindi, come creere qualcosa come un grafico, che potrebbe potenzialmente avere loop, un'istanza di Functor? Penso che un modo più generalizzato per dirlo è, in che modo i tipi non-induttivi "si adattano" ai Functional?
Più ci penso, più mi rendo conto che l'induttivo/non induttivo non ha molta importanza. tipi induttivi sono solo più facili per definire fmap
per ...
Se volevo fare un grafico un'istanza di Functor, avrei dovuto implementare un algoritmo grafico attraversamento all'interno FMAP; per esempio probabilmente dovrebbe usare una funzione di supporto che tenga traccia dei nodi visitati. A questo punto, mi chiedo ora perché preoccuparsi di definirlo come un Functor invece di scrivere solo questo come funzione stessa? Per esempio. mappa vs fmap per gli elenchi ...?
Spero che qualcuno con esperienza, storie di guerra e cicatrici possa far luce. Grazie!
La migliore intuizione che posso darti è: se pensi che qualcosa sia un functor, rendilo un'istanza di functor. Sarà utile alla fine. Tu ** vorrà applicare Fmap ad esso. GHC lo rende davvero facile, con l'estensione DeriveFunctor. – nomen