gpt4 book ai didi

haskell - DefaultSignatures 和相关的类型族

转载 作者:行者123 更新时间:2023-12-04 14:59:01 25 4
gpt4 key购买 nike

有没有办法使用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) = xtype ForwardBar (Bar x) = Forward x .每当我为某些 Bar x 定义实例时,我想自动派生它.但是,customFunc 的定义是不同的。这可能吗?

也可以将默认签名添加到另一个文件(或包)中的类的函数。我正在使用一些我想添加默认签名的类,但我不想修改类定义本身。

最佳答案

AFAIK,目前无法使用 DefaultSignatures与类型族。

我可以看到两种选择来做你想做的事。两者都有某些缺点,但也许它们足以满足您的目的。

选项 1:使用正常的关联类型默认定义

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"

选项 2:改用类型族
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"

关于haskell - DefaultSignatures 和相关的类型族,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22087549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com