Ho difficoltà a capire come una funzione può essere una monade.Funzione come istanza di Monad
Funzione (->) r
è una monade in base ad una dichiarazione in Control.Monad.Instances
:
instance Monad ((->) r) where
return x = \_ -> x
h >>= f = \w -> f (h w) w
Anche ciò che Miran Lipovača says su di esso mi rende confuso:
L'implementazione per
>>=
sembra un po 'criptico, ma in realtà non è lo . Quando si utilizza>>=
per inviare un valore monadico a una funzione, il risultato è sempre un valore monadico. Quindi, in questo caso, quando alimentiamo una funzione in un'altra funzione, il risultato è anche una funzione. Questo è perché il risultato inizia come un lambda. Tutte le implementazioni di>>=
finora hanno sempre in qualche modo isolato il risultato del valore monadico e quindi hanno applicato la funzione f a quel risultato. La stessa cosa succede qui. Per ottenere il risultato da una funzione, dobbiamo applicarlo a qualcosa, motivo per cui facciamo(h w)
qui per ottenere il risultato dalla funzione e quindi applichiamo f a quello. f restituisce un valore monadico, che nel nostro caso è , quindi lo applichiamo anche a w.
Il tipo di firma (>> =) è questa: (>> =) :: ma -> (A -> mb) -> mb
così prendo che h
viene digitato come m a
e f
come (a -> m b)
. Se una funzione è m a
, restituisce un valore di tipo a
? o restituisce qualcos'altro prendendo un tipo a
?
Se il valore non-monade di h
è alimentato a f
, allora otteniamo: f (h w) guarda bene. Dal momento che f
è una funzione e ha preso la sua unica argomentazione, è già un valore, no? Poiché si tratta di una funzione monadica, il valore è anche un valore monadico. Perché allora ha bisogno di un altro valore w
? Non sta alimentando w
a f something
rendendolo non-monadico, cioè, non è più una funzione, no? Non riesco nemmeno a capire perché f something
e h
prendiamo lo stesso argomento w
e restituiamo diversi tipi di valore (m a
e m b
).
Grazie. È tutto chiaro! – amemus