2016-05-09 26 views
16

Dal wiki Haskell:Le leggi monad sono applicate a Haskell?

Monadi possono essere visti come interfaccia di programmazione standard per vari dati o strutture di controllo, che viene catturato dalla classe Monade. Tutti monadi comuni sono membri di esso:

class Monad m where 
    (>>=) :: m a -> (a -> m b) -> m b 
    (>>) :: m a -> m b -> m b 
    return :: a -> m a 
    fail :: String -> m a 

Oltre ad attuare le funzioni di classe, tutte le istanze di Monade devono obbedire le seguenti equazioni, o le leggi Monade:

return a >>= k = k a 
m >>= return = m 
m >>= (\x -> k x >>= h) = (m >>= k) >>= h 

Domanda : Le tre leggi monad in basso sono effettivamente applicate in qualche modo dalla lingua? Oppure sono assiomi aggiuntivi che lo deve applicare per costruire il tuo linguaggio di una "Monade" in modo che corrisponda al concetto matematico di una "Monade"?

+7

Essi non vengono applicate dal linguaggio o compilatore. Il programmatore è responsabile di assicurarsi che le leggi siano valide. – ErikR

+0

Poiché Haskell è una lingua * Turing complete *, non è possibile applicare alcuna legge sulle sue funzioni. –

+9

@WillemVanOnsem Questo è davvero fuorviante. Un linguaggio completo che gira può ancora avere un sistema di prova e fornire garanzie sulle operazioni. Ad esempio, molte estensioni (spesso basate su SMT) sopra Haskell possono dimostrare le leggi della monade: questi nuovi linguaggi estesi diventano improvvisamente non completi di Turing? –

risposta

18

L'utente è responsabile dell'applicazione di un'istanza Monad alle leggi di monade. Ecco un semplice esempio di non.

Anche se il suo tipo è compatibile con i metodi Monad, contando il numero di volte in cui l'operatore si legano è stato utilizzato non è una monade perché viola la legge m >>= return = m

{-# Language DeriveFunctor #-} 

import Control.Monad 

data Count a = Count Int a 
    deriving (Functor, Show) 

instance Applicative Count where 
    pure = return 
    (<*>) = ap 

instance Monad Count where 
    return = Count 0 
    (Count c0 a) >>= k = 
     case k a of 
      Count c1 b -> Count (c0 + c1 + 1) b 
10

No, le leggi della monade non sono applicate dalla lingua. Ma se non li rispetti, il tuo codice potrebbe non comportarsi necessariamente come ci si aspetterebbe in alcune situazioni. E sarebbe sicuramente fonte di confusione per gli utenti del tuo codice.