2013-06-20 7 views
6

Sind die folgenden zwei Implementierungen von flatten gleichwertig für alle wohlerzogenen Monaden?Rückgabe eines aus einer Monade extrahierten Elements; redundant?

flatten1 xss = do 
    xs <- xss 
    x <- xs 
    return x 

flatten2 xss = do 
    xs <- xss 
    xs 
+3

Yup, 100% identisch. Sie könnten einfach 'Control.Monad' importieren und' Join' schreiben oder 'xss >> = id' verwenden. –

+1

Ja. 'tue {...; x <- m; return x} 'ist immer gleich' do {...; m} '. –

Antwort

9

Ja, sie sind identisch. Sie sind als entzuckert

flatten1 xss = 
    xss >>= \xs -> xs >>= \x -> return x 

flatten2 xss = do 
    xss >>= \xs -> xs 

Die erste ist äquivalent zu

xss >>= \xs -> xs >>= return 

und durch die Right identity monad law entspricht

xss >>= \xs -> xs 
5

Kurz gesagt, ja. Um das zu beweisen:

Sie haben geschrieben:

xss >>= (\xs -> xs >>= \x -> return x) 
xss >>= (\xs -> xs >>= return) -- eta 

in der ersten und

xss >>= (\xs -> xs) 
xss >>= id 

nach dem monad laws ist return eine richtige Identität, so dass

m >>= return === m 

so können wir

tun
xss >>= (\ xs -> xs >>= return) 
xss >>= (\ xs -> xs) 
xss >>= id