Восстановите определения типов, используя 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))
    }

0 ответов

Другие вопросы по тегам