3

我需要为新类型编写大量任意实例。我试图通过 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)
4

0 回答 0