Haskell 如何将DerivingVia与任意

Haskell 如何将DerivingVia与任意,haskell,ghc,quickcheck,Haskell,Ghc,Quickcheck,我需要为新类型编写大量任意实例。 我试图通过GHC扩展来降低打字和使用派生的成本 我的用例符合要求,但在运行时崩溃了!GHCi为8.8.4 import Test.QuickCheck (Gen, elements, listOf, Arbitrary, arbitrary) genSafeChar = elements ['a'..'z'] genSafeString = listOf genSafeChar newtype SafeString = SafeString String de

我需要为新类型编写大量任意实例。 我试图通过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)
:t(任意::Gen SafeString)
(任意::Gen SafeString)::Gen SafeString
>:t(任意::Gen MyS)
:1:2:错误:
•无法将类型“SafeString”与“MyS”匹配
预期类型:Gen MyS
实际类型:Gen SafeString
•在表达式中:(任意::Gen MyS)

这不是运行时错误。这是一个类型错误,因此它将在编译时引发。当然,在
ghci
中,您是以交互方式编写的。如果对该实例使用
StandaloneDeriving
,会发生什么情况?看起来GHC对实例施加了一个不可满足的约束,我不知道为什么。这是完整的日志吗?如果您使用单态定义对
任意
进行阴影处理,这看起来像是一个错误。@李耀霞您是对的