Perché non monad prendere '(M a - M b)'?

3

Tutte le scuse - Sono ancora molto al di fuori di Haskell.

Perché il bind di una monade ha questa firma:

M a -> (a -> M b) -> M b

e non

M a -> (M a -> M b) -> M b

vale a dire. una funzione che accetta M a invece di solo a

a è disponibile per la funzione in entrambi, ma il contesto che M fornisce non è disponibile per la funzione nel 1 °. Solo il valore elevato stesso.

(Se questa è una domanda stupida, mi limita a molto tempo e la cancellerò ... come dico, ancora molto all'esterno)

    
posta Rob 26.02.2014 - 23:48
fonte

2 risposte

4

Solo un suggerimento: a -> M b è più generale di M a -> M b , poiché puoi fare a -> M a in qualsiasi momento con return .

    
risposta data 27.02.2014 - 08:24
fonte
5

Chiamiamo le funzioni che restituiscono un valore monadico "azioni".

La firma del tipo per >>= in p >>= q dice che:

  • Data un'azione nullata p che restituisce qualcosa di tipo a
  • E data un'azione unaria q che prende un a e restituisce qualcosa di tipo b
  • Puoi concatenarli per ottenere un'azione null che restituisce qualcosa di tipo b

Vale la pena ricordare che >>= ha una versione capovolta: =<< , che potrebbe essere più facile da capire visivamente - corrisponde all'applicazione di funzione in una monade:

($)   :: (a ->   b) ->   a ->   b
(=<<) :: (a -> m b) -> m a -> m b

Mentre $ è l'applicazione di una funzione pura a un argomento puro:

succ $ 2 + 2

=<< è l'applicazione di una funzione effetto collaterale a un argomento con effetto collaterale:

putStrLn =<< readLine

E potresti aver visto l'operatore Applicativo <$> (un alias per fmap ), che è per l'altro caso comune di pure funzioni con argomenti a effetto collaterale:

lines <$> readFile "input.txt"
    
risposta data 27.02.2014 - 00:00
fonte

Leggi altre domande sui tag