4

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

data Artist = Artist Text Genre
data Genre = Jazz | Metal

使用派生Generic实例,默认实例(Modelable可以恢复其类型定义的事物类),以及ModelableText

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

到目前为止,我的代码涵盖了所有这些情况:

https://gist.github.com/Cedev/9857191

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

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

data Album = Album Artist [Track]
data Track = Track Int String

对于 an 的类型,以下是可接受的输出Album,但效率低下:

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]and String,所以我能得到的最接近的是这样的,它假定所有[]s 都包含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

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

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

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))
    }
4

0 回答 0