昨天我尝试回答这个问题是关于数据类型的表示。 https://stackoverflow.com/questions/22715572/a-serializable-representation-of-a-data-type-for-client-server-conformity-checki使用 GHC.Generics。我可以恢复给定示例问题的类型定义,例如:
data Artist = Artist Text Genre
data Genre = Jazz | Metal
与导出的Generic
实例,默认实例Modelable
(可以恢复其类型定义的事物的类),以及Modelable
实例为Text
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 https://gist.github.com/Cedev/9857191
我们可以恢复类型应用程序中的类型吗?
例如,现在我无法区分应用于两种不同类型的类型之间的区别[Track]
and String ~ [Char]
。来自Datatype
实例为D
在这种情况下我只能恢复外部类型GHC.Types.[]
,我什至无法区分这两种类型。
data Album = Album Artist [Track]
data Track = Track Int String
对于该类型,以下是可接受的输出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
我们可以恢复声明中的类型变量吗?
更好的表示将共享以下定义[]
。这需要发现[]
有善良* -> *
并且其第一个参数的类型:
构造函数来自类型参数[]
.
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
我们可以恢复除以下类型之外的事物的类型定义吗*
and * -> *
?
是否有可能恢复具有更多参数的事物的定义?
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))
}