2013-06-20 18 views
6

Czy są następujące dwie implementacje równoważenia spłaszczenia dla wszystkich dobrze zachowanych Monad?zwracając element wyodrębniony z monady; zbędny?

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

flatten2 xss = do 
    xs <- xss 
    xs 
+3

Tak, 100% identyczne. Możesz po prostu zaimportować 'Control.Monad' i napisać' join' lub użyć 'xss >> = id'. –

+1

Tak. 'do {...; x <- m; return x} 'jest zawsze równe' do {...; m.} '. –

Odpowiedz

9

Tak, są identyczne. Oni odcukrzona jak

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

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

Pierwszy z nich jest odpowiednikiem

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

i przez Right identity monad law równoważne do

xss >>= \xs -> xs 
5

Krótko mówiąc, tak. Aby to udowodnić:

Pisałeś:

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

w pierwszym i

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

według monad laws, return jest prawo tożsamości, tak by

m >>= return === m 

więc możemy zrobić

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