作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Random a"和 "=> Arbitrary a"-6ren"> Random a"和 "=> Arbitrary a"-在 Haskell,是否有用于生成 Random 的“标准”库/包?/Arbitrary枚举? 我编写了以下代码,但我不敢相信我是第一个有这种需求或解决它的人(而且我不确定我的解决方案是否完全正确)。-6ren">
在 Haskell,是否有用于生成 Random
的“标准”库/包?/Arbitrary
枚举?
我编写了以下代码,但我不敢相信我是第一个有这种需求或解决它的人(而且我不确定我的解决方案是否完全正确)。
另外,我希望现有的解决方案具有其他不错的功能。
这是一对从 Enum 类型中选择随机值的函数:
enumRandomR :: (RandomGen g, Enum e) => (e, e) -> g -> (e, g)
enumRandomR (lo,hi) gen =
let (int, gen') = randomR (fromEnum lo, fromEnum hi) gen in (toEnum int, gen')
enumRandom :: (RandomGen g, Enum e) => g -> (e, g)
enumRandom gen =
let (int, gen') = random gen in (toEnum int, gen')
System.Random.Random
的实例和
Test.QuickCheck.Arbitrary
{-# LANGUAGE FlexibleInstances, UndecidableInstances, OverlappingInstances #-}
instance (Enum a, Bounded a) => Random a where
random = enumRandom
randomR = enumRandomR
instance (Enum a, Bounded a) => Arbitrary a where
arbitrary = choose (minBound, maxBound)
Bounded
,
Enum
类型
data Dir = N | E | S | W
deriving (Show, Enum, Bounded)
> import Test.QuickCheck
> sample (arbitrary:: Gen Dir)
N
E
N
S
N
E
W
N
N
W
W
{-# LANGUAGE FlexibleInstances, UndecidableInstances, OverlappingInstances #-}"
- Constraint is no smaller than the instance head
in the constraint: Enum a
(Use -XUndecidableInstances to permit this)
- Overlapping instances for Random Int
arising from a use of `randomR'
Matching instances:
instance Random Int -- Defined in System.Random
instance (Enum a, Bounded a) => Random a
- Illegal instance declaration for `Random a'
(All instance types must be of the form (T a1 ... an)
where a1 ... an are *distinct type variables*,
and each type variable appears at most once in the instance head.
Use -XFlexibleInstances if you want to disable this.)
最佳答案
在这种情况下的标准解决方法是创建一个 newtype
包装器并为此提供实例。
{-# LANGUAGE GeneralizedNewtypeDeriving #-} -- avoid some boilerplate
newtype Enum' a = Enum' a
deriving (Bounded, Enum, Show)
instance (Enum a, Bounded a) => Random (Enum' a) where
random = enumRandom
randomR = enumRandomR
instance (Enum a, Bounded a) => Arbitrary (Enum' a) where
arbitrary = choose (minBound, maxBound)
prop_foo (Enum' x) = ... -- use x as before here
关于 haskell : "instance (Enum a, Bounded a) => Random a"和 "=> Arbitrary a",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9188409/
我是一名优秀的程序员,十分优秀!