В 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
type
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.)
Есть ли лучший способ? Не удается ли решить мое решение для некоторых (более "экзотических" ) ограниченных типов Enum, чем мой простой пример?