有没有办法将DefaultSignatures
扩展名与关联类型系列一起使用。
这是我需要它的一个例子。
class Foo p where
type Back p :: *
type Forward p :: *
customFunc :: p -> IO ()
newtype Bar a = Bar (Forward a)
data Bat = Bat
type family ForwardBar a :: *
type instance ForwardBar Bat = Int
instance Foo (Bar Bat) where
type Back (Bar Bat) = Bat
type Forward (Bar Bat) = ForwardBar Bat
customFunc _ = print "I am different customFunc and this is Bat Bat"
现在我想要p ~ Bar x
然后type Back (Bar x) = x
和type ForwardBar (Bar x) = Forward x
。每当我为某些Bar x
定义实例时,我想自动派生这个。但是,customFunc的定义是不同的。这可能吗?
还可以将默认签名添加到另一个文件(或包)中的类的函数中。我正在使用一些我想添加默认签名的类,但我不想修改类定义本身。
答案 0 :(得分:6)
AFAIK,目前无法将DefaultSignatures
用于类型系列。
我可以看到两个选项来做你想要的。两者都有一些缺点,但也许它们足以满足你的目的。
class Foo p where
type Back p :: *
type Back p = UnBar p
type Forward p :: *
type Forward p = ForwardBar (UnBar p)
customFunc :: p -> IO ()
需要助手类型系列UnBar
:
type family UnBar a :: *
type instance UnBar (Bar a) = a
实例可以只是:
instance Foo (Bar Bat) where
customFunc _ = print "I am different customFunc and this is Bat Bat"
class Foo p where
customFunc :: p -> IO ()
type family Back p :: *
type family Forward p :: *
现在我们可以给出所有Bar
类型的类型系列的一般实例:
type instance Back (Bar a) = a
type instance Forward (Bar a) = ForwardBar a
针对具体Bar
类型的类的更具体的实例:
instance Foo (Bar Bat) where
customFunc _ = print "I am different customFunc and this is Bat Bat"