• この処理を眺めてみる
  • ベルヌーイ事象とその独立試行の繰り返しの話
  • 二値型確率事象Bookをデータ型として作り、それに生起確率ベクトルを付け加えている。付け加えるときは、weightedという関数を使っている。有限事象の確率変数なのでFiniteというクラスを使っている
  • 2試行をつなげるには、単に、タプルにしている。ただし、出来上がるものも有限事象確率変数なのでFiniteを使っている
  • 多数回繰り返しは離散確率分布である Finite を要素とするベクトル
  • 組み合わせ事象の確率計算は exact
  • 条件を付けるときは condition関数を使った上で、bayes関数
module Main where

import Math.Probable

import qualified Data.Vector as V

data Book = Interesting 
		  | Boring
	deriving (Eq, Show)

bookPrior :: Finite d => d Book
bookPrior = weighted [ (Interesting, 0.2) 
					 , (Boring, 0.8) 
					 ]

twoBooks :: Finite d => d (Book, Book)
twoBooks = do
	book1 <- bookPrior
	book2 <- bookPrior
	return (book1, book2)

sampleBooks :: RandT IO (V.Vector Book)
sampleBooks = vectorOf 10 bookPrior

oneInteresting :: Fin (Book, Book)
oneInteresting = bayes $ do
	(b1, b2) <- twoBooks
	condition (b1 == Interesting || b2 == Interesting)
	return (b1, b2)

main :: IO ()
main = do
	print $ exact bookPrior
	mwc sampleBooks >>= print
	print $ exact twoBooks
	print $ exact oneInteresting