Создание произвольного экземпляра для нового типа, который использует 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
устарела! (Это все эквивалентны.)