[Haskell-beginners] Need better explanation of the 'flipThree' example in LYAH
Francesco Ariis
fa-ml at ariis.it
Tue Aug 21 01:00:57 UTC 2018
Hello Olumide,
On Tue, Aug 21, 2018 at 01:04:01AM +0100, Olumide wrote:
> My understanding of what's going on here is sketchy at best. One of several
> explanations that I am considering is that all combination of a, b and c are
> evaluated in (==Tails) [a,b,c] but I cannot explain how the all function
> creates 'fuses' the list [f a, f b, f c]. I know that all f xs = and . map f
> xs (the definition on hackage is a lot more complicated) but, again, I
> cannot explain how the and function 'fuses' the list [f a, f b, f c].
Let's copy the relevant monad instance:
instance Monad Prob where
return x = Prob [(x,1%1)]
m >>= f = flatten (fmap f m)
and desugar `flipThree:
flipThree = coin >>= \a ->
coin >>= \b ->
loadedCoin >>= \c ->
return (all (==Tails) [a,b,c])
Now it should be clearer: `coin >>= \a -> ...something...` takes `coin`
(Prob [(Heads,1%2),(Tails,1%2)]), applies a function (\a -> ...) to all
of its elements, flattens (probability wise) the result.
So approximately we have:
1. some list ([a, b])
2. nested lists after applying `\a -> ...` [[a1, a2], [b1, b2]]
3. some more flattened list [a1, a2, b1, b2]
`\a -> ...` itself contains `\b ->` which cointains `\c ->`, those are
nested rounds of the same (>>=) trick we saw above.
At each time the intermediate result is bound to a variable (\a, \b
and \c), so for each triplet we can use `all`.
> If I'm on the right track I realize that I'm going to have to study the list
> the between list comprehensions and the do-notation in order how all the
> return function create one Prob.
Indeed I recall working the example on paper the first time I read it:
once you do it, it should stick!
More information about the Beginners
mailing list