我需要为新类型编写大量任意实例。我试图通过 GHC 扩展来减少打字和使用派生。
我的用例符合要求,但在运行时崩溃了!GHCi 是 8.8.4
import Test.QuickCheck (Gen, elements, listOf, Arbitrary, arbitrary)
genSafeChar = elements ['a'..'z']
genSafeString = listOf genSafeChar
newtype SafeString = SafeString String deriving (Show, Eq)
instance Arbitrary SafeString where arbitrary = fmap SafeString genSafeString
:set -XDerivingVia
newtype MyS = MyS String deriving (Arbitrary, Show) via SafeString
> MyS "3"
SafeString "3"
显示工作正常,但任意没有!
> :t (arbitrary :: Gen SafeString)
(arbitrary :: Gen SafeString) :: Gen SafeString
> :t (arbitrary :: Gen MyS)
<interactive>:1:2: error:
• Couldn't match type ‘SafeString’ with ‘MyS’
Expected type: Gen MyS
Actual type: Gen SafeString
• In the expression: (arbitrary :: Gen MyS)