Восстановите определения типов, используя GHC.Generics
Вчера я попытался ответить на этот вопрос о представлении для типа данных. используя 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
Можем ли мы восстановить типы в приложении типов?
Прямо сейчас у меня нет никакого способа сказать разницу между типом, примененным к двум различным типам, например [Track]
а также 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]
а также 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
Можем ли мы восстановить определения типов для вещей, отличных от *
а также * -> *
?
Можно ли восстановить определения для вещей с большим количеством аргументов?
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))
}