Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解haskell随机硬币生成代码_Haskell - Fatal编程技术网

理解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

请帮助我理解下面的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 = 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

g
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”)。然后,它使用
    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