2013-06-20 24 views
6

Le seguenti due implementazioni di equivalente flatten per tutte le Monade ben educate?restituendo un elemento estratto da una monade; ridondante?

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

flatten2 xss = do 
    xs <- xss 
    xs 
+3

Yup, 100% identico. Potresti semplicemente importare 'Control.Monad' e scrivere' join', o usare 'xss >> = id'. –

+1

Sì. 'do {...; x <- m; return x} 'è sempre uguale a' do {...; m} '. –

risposta

9

Sì, sono identici. Sono private degli zuccheri come

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

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

Il primo è equivalente a

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

e dal Right identity monad law equivalente

xss >>= \xs -> xs 
5

In breve, sì. Per dimostrarlo:

Hai scritto:

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

nel primo e

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

secondo il monad laws, return è un'identità destra in modo che

m >>= return === m 

quindi possiamo fare

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