理解haskell随机硬币生成代码
请帮助我理解下面的haskell代码理解haskell随机硬币生成代码,haskell,Haskell,请帮助我理解下面的haskell代码 data Coin = Heads | Tails deriving ({-hi-}Eq, {-/hi-} Show,Enum,Bounded) instance Random Coin where randomR (a,b) g = case randomR (fromEnum a, fromEnum b) g of (x,g') -> (toEnum x,g') random g = rando
data Coin = Heads | Tails deriving ({-hi-}Eq, {-/hi-} Show,Enum,Bounded)
instance Random Coin where
randomR (a,b) g =
case randomR (fromEnum a, fromEnum b) g of
(x,g') -> (toEnum x,g')
random g = randomR (minBound,maxBound) g
coins = do
g <- newStdGen
print . take 10 $ (randoms g::[Coin])
count = 10000
process :: [Coin] -> (Int,Int)
process cs = (length cs,length (filter (== Heads) cs))
display::(Int,Int) -> String
display (coins,heads) = "We got " ++ (show $ 100.0 * fromIntegral heads / fromIntegral coins) ++ "% heads. "
r = do
g <- newStdGen
putStrLn . display .process . take count $ randoms g
data Coin=Heads | Tails派生({-hi-}Eq,{-/hi-}Show,Enum,Bounded)
比如随机硬币在哪里
随机r(a,b)g=
案例随机数r(从枚举a到枚举b)g
(x,g')->(toEnum x,g'))
random g=randomR(minBound,maxBound)g
硬币=do
g(整数,整数)
过程cs=(长度cs,长度(过滤器(=头)cs))
显示::(Int,Int)->字符串
显示(硬币,人头)=“我们得到”++(显示100.0美元*来自积分人头/积分硬币)++%heads。“
r=do
gCoin
是一种代数数据类型,具有两个构造函数,Heads
和Tails
,表示具有两个值的枚举。它同构于(与)Bool具有相同的结构),但它是一种独特的类型
派生(Eq、Show、Enum、Bounded)
自动生成TypeClass的实现:
Eq
,支持测试与=
Show
,用于将值转换为字符串以进行调试
Enum
,用于使用前置函数和后续函数枚举值pred
和succ
Bounded
,具有minBound
(此处为Heads
)和maxBound
(Tails
)的类型
{-
..-}
只是一条注释,编译器会忽略它;似乎作者打算使用某种非Haskell格式符号,但这种符号不能正常工作
instance Random Coin,其中
开始实现Coin
类型的Random
typeclass,从而实现硬币的随机生成。它有两种方法的实现:
randomR(a,b)g
描述了如何使用随机生成器g
生成范围a
到b
的随机值。实现调用randomR
,使用Enum
类在参数a
和b
范围内生成一个随机整数。如果a
为Heads
,则枚举a的为0
;如果b
为Tails
,则枚举b的为1
。符号的大小写
…对该函数的结果执行模式匹配,得到一对随机值x
和一个更新的随机生成器g'
(发音为“g prime”)。然后,它使用toEnum
将x
从整数转换回Coin
,并返回硬币值以及更新的生成器
random
介绍如何仅从生成器生成随机硬币,而不将范围作为输入。它使用给定的生成器g
,在minBound
(Heads
)和maxBound
(Tails
)之间生成抛硬币
coins
是一个IO
操作,它使用newStdGen
创建一个新的标准随机生成器,然后使用randoms g:[coin]
从该生成器生成一个无限的随机抛硬币列表(流)。它使用take
获取该列表的前10个元素,并使用print
输出它们
r
类似于硬币
,但也通过过程
函数运行硬币抛掷,该函数返回一对给定的硬币数量(长度cs
)和头部
(长度(过滤器(=头部)cs)
);以及将结果格式化为字符串百分比的display
函数。Coin
是一种代数数据类型,具有两个构造函数,Heads
和Tails
,表示具有两个值的枚举。它同构于(与)Bool具有相同的结构),但它是一种独特的类型
派生(Eq、Show、Enum、Bounded)
自动生成TypeClass的实现:
Eq
,支持测试与=
Show
,用于将值转换为字符串以进行调试
Enum
,用于使用前置函数和后续函数枚举值pred
和succ
Bounded
,具有minBound
(此处为Heads
)和maxBound
(Tails
)的类型
{-
..-}
只是一条注释,编译器会忽略它;似乎作者打算使用某种非Haskell格式符号,但这种符号不能正常工作
instance Random Coin,其中
开始实现Coin
类型的Random
typeclass,从而实现硬币的随机生成。它有两种方法的实现:
randomR(a,b)g
描述了如何使用随机生成器g
生成范围a
到b
的随机值。实现调用randomR
,使用Enum
类在参数a
和b
范围内生成一个随机整数。如果a
为Heads
,则枚举a的为0
;如果b
为Tails
,则枚举b的为1
。符号的大小写
…对该函数的结果执行模式匹配,得到一对随机值x
和一个更新的随机生成器g'
(发音为“g prime”)。然后将x
从整数转换回Co
module Coin where
import System.Random
data Coin = Tails | Heads deriving (Eq)
instance Enum Coin where
toEnum 0 = Tails
toEnum 1 = Heads
fromEnum Tails = 0
fromEnum Heads = 1
instance Bounded Coin where
minBound = Tails
maxBound = Heads
instance Random Coin where
randomR (coin1, coin2) gen =
case randomR (fromEnum coin1, fromEnum coin2) gen of
(x, gen') -> (toEnum x, gen')
random gen = randomR (minBound, maxBound) gen
instance Random Coin where
randomR (Tails, Heads) gen =
case randomR (0, 1) gen of
(0, gen') -> (Tails, gen')
(1, gen') -> (Heads, gen')
randomR (someCoin, _) gen = (someCoin, gen)
random gen = randomR (Tails, Heads) gen