Haskell 如何将DerivingVia与任意
我需要为新类型编写大量任意实例。 我试图通过GHC扩展来降低打字和使用派生的成本 我的用例符合要求,但在运行时崩溃了!GHCi为8.8.4Haskell 如何将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
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对实例施加了一个不可满足的约束,我不知道为什么。这是完整的日志吗?如果您使用单态定义对任意进行阴影处理,这看起来像是一个错误。@李耀霞您是对的