gpt4 book ai didi

haskell - 在 Haskell 中从用户定义的数据类型生成随机值

转载 作者:行者123 更新时间:2023-12-04 00:06:52 25 4
gpt4 key购买 nike

类似:Haskell Random from Datatype

我创建了一个数据类型来包含石头剪刀布游戏中的不同武器。

data Weapon = Rock | Paper | Scissor

现在我想生成一个随机武器,计算机将使用它来对付用户。
我看了一下我在开始时发布的类似链接,但这对我来说似乎太笼统了。

我能够从任何其他类型生成随机数。我能想到的是如何使我的数据类型成为 Random 类的实例。

最佳答案

生成随机Weapon , 是否制作 Weapon Random 的一个实例与否,您需要一种将数字映射到 Weapon 的方法s。如果推导出 Enum对于类型,映射到和来自 Int s 由编译器定义。所以你可以定义

randomWeapon :: RandomGen g => g -> (Weapon, g)
randomWeapon g = case randomR (0,2) g of
(r, g') -> (toEnum r, g')

例如。与 Enum例如,您也可以轻松制作 Weapon Random 的一个实例:
instance Random Weapon where
random g = case randomR (0,2) g of
(r, g') -> (toEnum r, g')
randomR (a,b) g = case randomR (fromEnum a, fromEnum b) g of
(r, g') -> (toEnum r, g')

如果有可能从类型中添加或删除构造函数,最好的方法是保持 randomR 的边界。与类型同步的是还导出 Bounded ,如 Joachim Breitner immediately suggested :
data Weapon
= Rock
| Paper
| Scissors
deriving (Bounded, Enum)

instance Random Weapon where
random g = case randomR (fromEnum (minBound :: Weapon), fromEnum (maxBound :: Weapon)) g of
(r, g') -> (toEnum r, g')
randomR (a,b) g = case randomR (fromEnum a, fromEnum b) g of
(r, g') -> (toEnum r, g')

关于haskell - 在 Haskell 中从用户定义的数据类型生成随机值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11811498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com