LINUX.ORG.RU

Последовательность получения результата функции

 ,


0

1

В книге «Изучайте Haskell во имя добра» есть такой пример:

import Data.Ratio
import Data.List (all)

newtype Prob a = Prob { getProb :: [(a, Rational)] } deriving Show

instance Functor Prob where
	fmap f (Prob xs) = Prob $ map (\(x, p) -> (f x, p)) xs

flatten :: Prob (Prob a) -> Prob a
flatten (Prob xs) = Prob $ concat $ map multAll xs
	where multAll (Prob innerxs, p) = map (\(x, r) -> (x, p * r)) innerxs

instance Monad Prob where
	return x = Prob [(x, 1 % 1)]
	m >>= f = flatten (fmap f m)

data Coin = Heads | Tails deriving (Show, Eq)

coin :: Prob Coin
coin = Prob [(Heads, 1 % 2), (Tails, 1 % 2)]

loadCoin :: Prob Coin
loadCoin = Prob [(Heads, 1 % 10), (Tails, 9 % 10)]

flipThree :: Prob Bool
flipThree = do
	a <- coin
	b <- coin
	c <- loadCoin
	return (all (==Tails) [a, b, c])

flipThree' :: Prob [Coin]
flipThree' =
	coin >>= (\x ->
	coin >>= (\y ->
	loadCoin >>= (\z ->
	return [x, y, z])))

Результат flipThree'

Prob {getProb = [([Heads,Heads,Heads],1 % 40),([Heads,Heads,Tails],9 % 40),([Heads,Tails,Heads],1 % 40),([Heads,Tails,Tails],9 % 40),([Tails,Heads,Heads],1 % 40),([Tails,Heads,Tails],9 % 40),([Tails,Tails,Heads],1 % 40),([Tails,Tails,Tails],9 % 40)]}
Я логику результата, в принципе, понимаю, но как в той шутке, угадал все буквы, но не смог произнести слово. Для меня не очень понятно, как получается такой результат:
Prob [([([Heads,Heads,Heads],GHC.Real.:% 1 20),
        ([Heads,Heads,Tails],GHC.Real.:% 9 20),
        ([Heads,Tails,Heads],GHC.Real.:% 1 20),
        ([Heads,Tails,Tails],GHC.Real.:% 9 20)],GHC.Real.:% 1 2),
      ([([Tails,Heads,Heads],GHC.Real.:% 1 20),
        ([Tails,Heads,Tails],GHC.Real.:% 9 20),
        ([Tails,Tails,Heads],GHC.Real.:% 1 20),
        ([Tails,Tails,Tails],GHC.Real.:% 9 20)],GHC.Real.:% 1 2)]
Судя по всему, его предварял такой:
Prob [([([Heads,Heads],GHC.Real.:% 1 10),
        ([Heads,Tails],GHC.Real.:% 9 10)],GHC.Real.:% 1 2),
      ([([Tails,Heads],GHC.Real.:% 1 10),
        ([Tails,Tails],GHC.Real.:% 9 10)],GHC.Real.:% 1 2),
      ([([Heads,Heads],GHC.Real.:% 1 10),
        ([Heads,Tails],GHC.Real.:% 9 10)],GHC.Real.:% 1 2),
      ([([Tails,Heads],GHC.Real.:% 1 10),
        ([Tails,Tails],GHC.Real.:% 9 10)],GHC.Real.:% 1 2)]
Т.е. получается, что я не понимаю, как выполняется
fmap f m
Что в данном примере представляет из себя
f
?


Честно говоря я так и не смог понять что именно ты не понял.

KblCb ★★★★★
()

Ну порасписывай на бумажке, что в каком месте получается, раз так не понимаешь.

devsdc ★★
()

Решение

flipTwo = coin >>= \x -> loadCoin >>= \z -> return [x,z]

flipTwo = flatten (fmap (\x -> loadCoin >>= \z -> return [x, z]) coin)

flipTwo = flatten (fmap (\x -> flatten (fmap (\z -> return [x, z]) loadCoin)) coin)

flipTwo = flatten (fmap (\x ->
	  flatten (Prob [((\z -> return [x, z]) Heads, 1 % 10),
	  	         ((\z -> return [x, z]) Tails, 9 % 10)])) coin)

flipTwo = flatten (fmap (\x ->
	  flatten (Prob [(Prob [([x, Heads], 1 % 1)], 1 % 10),
	  	         (Prob [([x, Tails], 1 % 1)], 9 % 10)])) coin)

flipTwo = flatten (fmap (\x -> (Prob [([x, Heads], 1 % 10),
				      ([x, Tails], 9 % 10)])) coin)

flipTwo = flatten (Prob [(Prob [([Heads, Heads], 1 % 10),
			        ([Heads, Tails], 9 % 10)], 1 % 2),
		         (Prob [([Tails, Heads], 1 % 10),
			        ([Tails, Tails], 9 % 10)], 1 % 2)])
tuxin
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.