Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 使用GHC.Generics恢复类型定义_Haskell_Ghc Generics - Fatal编程技术网

Haskell 使用GHC.Generics恢复类型定义

Haskell 使用GHC.Generics恢复类型定义,haskell,ghc-generics,Haskell,Ghc Generics,昨天我尝试使用GHC.Generics来回答这个问题。我可以恢复给定示例问题的类型定义,例如: data Artist = Artist Text Genre data Genre = Jazz | Metal 使用派生的通用实例,可建模的默认实例(可以恢复其类型定义的类),以及可建模的实例,可建模文本 deriving instance Generic Artist instance Modelable Artist deriving instance Generic Genre ins

昨天我尝试使用GHC.Generics来回答这个问题。我可以恢复给定示例问题的类型定义,例如:

data Artist = Artist Text Genre
data Genre = Jazz | Metal
使用派生的
通用
实例,可建模的默认实例(可以恢复其类型定义的类),以及可建模的
实例,可建模
文本

deriving instance Generic Artist
instance Modelable Artist

deriving instance Generic Genre 
instance Modelable Genre
根据前面的类型声明,我们可以确定
undefined::Artist
的类型为
Main.Artist

data Main.Artist :: *
        Artist Data.Text.Text Main.Genre
data Main.Genre :: *
        Jazz
        Metal

Main.Artist
我用声明表示该类型,以便我们也可以攻击递归数据结构,如

data ExampleTree = Branch Int ExampleTree ExampleTree | Leaf
我们可以确定的是

data Main.ExampleTree :: *
        Branch GHC.Int.Int Main.ExampleTree Main.ExampleTree
        Leaf

Main.ExampleTree
到目前为止,我的守则涵盖了所有这些情况:

我们可以恢复类型应用程序中的类型吗?

现在我无法区分应用于两种不同类型的类型之间的区别,例如
[Track]
String~[Char]
。从
D
Datatype
实例中,我只能恢复外部类型,在本例中,
GHC.Types.[]
,我甚至无法区分这两种类型

data Album = Album Artist [Track]
data Track = Track Int String
以下是
相册类型的可接受输出,但效率较低:

data GHC.Types.[] GHC.Char.Char :: *
        []
        : GHC.Char.Char GHC.Types.[]
data GHC.Types.[] Main.Track :: *
        []
        : Main.Track GHC.Types.[]
data Main.Album :: *
        Album Main.Artist (GHC.Types.[] Main.Track)
data Main.Artist :: *
        Artist Data.Text.Text Main.Genre
data Main.Genre :: *
        Jazz
        Metal
data Main.Track :: *
        Track GHC.Int.Int (GHC.Types.[] GHC.Char.Char)

Main.Album
由于我无法区分
[Track]
String
之间的区别,因此我能得到的最接近的结果是这样的,它假定所有
[]
都包含
Track
,因为这是第一次遇到的:

data GHC.Types.[] :: *
        []
        : Main.Track GHC.Types.[]
data Main.Album :: *
        Album Main.Artist GHC.Types.[]
data Main.Artist :: *
        Artist Data.Text.Text Main.Genre
data Main.Genre :: *
        Jazz
        Metal
data Main.Track :: *
        Track GHC.Int.Int GHC.Types.[]

Main.Album
我们可以恢复声明中的类型变量吗?

更好的表示法将共享
[]
的定义。这需要发现
[]
具有种类
*->*
,并且其
构造函数的第一个参数的类型来自
[]
的类型参数

data GHC.Types.[] :: * -> *
        []
        : (Var 0) GHC.Types.[]
data Main.Album :: *
        Album Main.Artist (GHC.Types.[] Main.Track)
data Main.Artist :: *
        Artist Data.Text.Text Main.Genre
data Main.Genre :: *
        Jazz
        Metal
data Main.Track :: *
        Track GHC.Int.Int (GHC.Types.[] GHC.Char.Char)

Main.Album
除了
*
*->*
之外,我们是否可以恢复类型定义?

有可能恢复具有更多参数的事物的定义吗

data ThreeTuple a b c = ThreeTuple a b c
例如,哪个应该是

data Module.ThreeTuple :: * -> * -> * -> *
        ThreeTuple (Var 0) (Var 1) (Var 2)
有可能恢复高阶类事物的定义吗

data Position f = {
    positionName :: f String
}

data Employee f = {
    employeeName :: f String,
    employeePosition :: f (Position f)
}
那是什么

data Module.Position :: (* -> *) -> *
    Position {
        positionName :: (Var 0) (GHC.Types.[] GHC.Char.Char)
    }

data Module.Employee :: (* -> *) -> *
    Employee {
        employeeName :: (Var 0) (GHC.Types.[] GHC.Char.Char),
        employeePosition :: (Var 0) (Module.Position (Var 0))
    }

我所知道的找到使用GHC.Generics示例的最好地方是generic派生包()。最接近的例子是Generics.Deriving.TH,它似乎和我做的完全一样。