我有一些计算被标记为特定类型 (T) 的类型 ('A/'B)。我希望最终依赖于代码中的类型,因此我使用实例将类型映射回来:
data T = A | B -- also generates types 'A and 'B
class R (t :: T) where r :: Proxy t -> T
instance R 'A where r _ = A
instance R 'B where r _ = B
foo :: forall (t :: T) . R t => Bar T Int
foo = case r (Proxy :: Proxy t) of A -> ....
这没问题,但我想知道如果我有类型注释,我是否可以省去R t
一直写出约束的时间t
。是否可以重新组织此方案以更方便使用?谢谢。
(标题编辑:最初我写的是封闭类型家族,但这里它更像是给定类型的一组封闭类型。)
我能最接近地了解您想要的是使用
PartialTypeSignatures
GHC 推断约束,如下所示:这仍然会生成使用警告
_
,但可以使用编译器标志将其关闭-Wno-partial-type-signatures
。与往常一样,使用推理时要小心谨慎。GHC 可能会意外地推断出与你打算使用的约束不同的约束,从而使
foo
编译顺利进行,但在foo
以后使用时会导致神秘的类型错误。推理很棒,但有时也会引起很多混乱。