Oltre a visualizzare un funtore come un contenitore, è anche possibile visualizzarlo come un certo tipo di contesto. I tuoi valori sono in questo contesto e se vuoi operare su di essi, devi utilizzare map
per sollevare una funzione nel contesto. Un altro modo per dirla è che i tuoi valori sono aumentati con quel contesto.
Per capire in che modo il functor di elenco è un contesto di scelta non deterministica, può essere utile vedere come un altro functor è un contesto: Il functor di Maybe è un contesto di un calcolo che potrebbe non riuscire. Se si tenta di applicare una funzione a un valore in un functor Maybe, il valore risultante manterrà lo stesso contesto in cui si è verificato o meno un calcolo non riuscito.
Allo stesso modo, una lista può essere vista come il risultato di una computazione che non ha un risultato deterministico, ma il cui risultato potrebbe invece essere scelto non deterministicamente da uno di più valori. Se si è tentato di mappare una funzione su una lista con 3 elementi, tali elementi sarebbero stati modificati, ma il contesto in cui si poteva scegliere tra tre valori rimaneva lo stesso.
Prendendo in prestito un po 'di Dan Burton risposta, guarda la notazione monadica per gli elenchi:
foo = do
x <- [1 .. 10]
y <- [2, 3, 5, 7]
return (x * y)
sembra a prima un po' strano, dal momento che la notazione sembra indicare, che si potrebbe estrarre un singolo valore da ognuna delle liste, ma poi ottieni come risultato una lista lunga 40 elementi. Ha più senso quando si guardano i funtori (beh, le monadi in questo caso) come un contesto per un singolo valore. Nell'esempio, x
e sono tali valori, ma il loro contesto è che non sono deterministici. Quando si moltiplicano due di questi valori, si ottiene un ancor più nondeterminismo, risultante in una lista più lunga. Quindi con monade e >>=
, il contesto può essere modificato, mentre con i funtori e map
, non può.
Da dove viene questa citazione? Ho sentito della lista _monad_ che rappresenta la scelta non deterministica, ma non la lista _functor_. – ivanm
La citazione proviene da: http://www.haskell.org/haskellwiki/Typeclassopedia#Instances – groodt