Создание произвольного экземпляра для нового типа, который использует Maybe

Я хочу создать Arbitrary экземпляр для следующего нового типа, чтобы использовать его для QuickCheck:

newtype Wrapmaybe a = Wrapmaybe {getMaybe :: Maybe a} deriving (Eq, Show)

Я знаю что Arbitrary экземпляр для Maybe можно записать следующим образом:

instance Arbitrary a => Arbitrary (Maybe a) where
     arbitrary = frequency [(1, return Nothing), (1, liftM Just arbitrary)]

Как мне написать Arbitrary экземпляр для чего-то вроде следующего без получения ошибки типа или ошибки типа:

instance Arbitrary a => Arbitrary (Wrapmaybe Maybe a) where
   etc...

1 ответ

Ну, вы могли бы просто заменить каждый Maybe конструктор в этом случае с соответствующим конструктором для вашего нового типа:

instance Arbitrary a => Arbitrary (WrapMaybe a) where
  arbitrary = frequency [ (1, return $ WrapMaybe Nothing)
                        , (1, fmap (WrapMaybe . Just) arbitrary) ]

Однако проще сделать это один раз для результата, используя уже существующие Maybe пример:

instance Arbitrary a => Arbitrary (WrapMaybe a) where
  arbitrary = fmap WrapMaybe arbitrary

Вы также можете написать WrapMaybe <$> arbitrary, Но, пожалуйста, не используйте liftM устарела! (Это все эквивалентны.)

Другие вопросы по тегам