문제

Are the following two implementations of flatten equivalent for all well-behaved Monads?

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

flatten2 xss = do
    xs <- xss
    xs
도움이 되었습니까?

해결책

Yes, they're identical. They're desugared as

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

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

The first one is equivalent to

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

and by the Right identity monad law equivalent to

xss >>= \xs -> xs

다른 팁

In short, yes. To prove it:

You've written:

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

in the first and

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

according to the monad laws, return is a right identity so that

m >>= return === m

so we can do

xss >>= (\ xs -> xs >>= return )
xss >>= (\ xs -> xs )
xss >>= id
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top