Haskell GHC.泛型表示是如何工作的?

Haskell GHC.泛型表示是如何工作的?,haskell,generics,ghc,Haskell,Generics,Ghc,我真的被GHC.Generics中的“泛型表示类型”弄糊涂了。我不明白这个数据类型是如何工作的。例如,元信息,M1: newtype M1 i c f p M1 unM1 :: f p 为什么E类型M1有四个类型变量:i、c、f和p。我的意思是,为什么是4。它有什么特殊的意义吗 此外,任何适合初学者学习GHC仿制药的书籍或论文都将不胜感激。关于GHC仿制药的资源并不多。你最好的选择是黑客文档、博客帖子和阅读源代码 这里是一个简化的类型同义词参考列表,我保存这些同义词是为了记住GHC.Gen

我真的被GHC.Generics中的“泛型表示类型”弄糊涂了。我不明白这个数据类型是如何工作的。例如,元信息,
M1

newtype M1 i c f p
M1
  unM1 :: f p
为什么E类型
M1
有四个类型变量:i、c、f和p。我的意思是,为什么是4。它有什么特殊的意义吗


此外,任何适合初学者学习GHC仿制药的书籍或论文都将不胜感激。

关于GHC仿制药的资源并不多。你最好的选择是黑客文档、博客帖子和阅读源代码

这里是一个简化的类型同义词参考列表,我保存这些同义词是为了记住GHC.Generics中所有类型的含义

type TypeName = D1 ('MetaSelector name moduleName packageName isNewType) rest
-- Company from data Company = MkCompany { name :: String, address :: String }

type Constructor = C1 ('MetaCons constructor prefixOrInfix isRecord) rest
-- MkCompany from data Company = MkCompany { name :: String, address :: String }

type NamedSelector = S1 ('MetaSel ('Just selector) unpackednesss sourceStrictness decidedStrictness)
-- age from data Person = Person { age :: Int }

type UnnamedSelector = S1 ('MetaSel Nothing unpackednesss sourceStrictness decidedStrictness)
-- Int from data Wrapper = Wrapper Int

type ConcatSelectors = (:*:)

type ConcatConstructors = (:+:)

type TypeParameter a = Rec0 a
-- a from the right side of data Wrapper a = Wrapper {getA :: a}

type ConstructorEmptyValuePlaceholder = U1
-- data Empty = MkEmpty, MkEmpty is a Constructor but takes no values
-- ConstructorEmptyValuePlaceholder fills the type requirement of Constructor

M1
存储元信息<代码>i指示它是否存储记录选择器、构造函数或数据类型
c
是为每个数据类型生成的标记-它允许您以字符串形式访问原始数据类型、记录选择器或构造函数的名称以及其他内容
f
是数据类型的“分支”,而
p
是“叶子”。所有这些都在的文档中。您有两件事叫做
EmptySelector
。我不懂这个列表的语法。喜欢
选择器类型
应该是什么意思?@dfeur我把它清理了一点,并修复了命名。左边的东西应该是类型同义词。它只是帮助理解GHC.Generics中文档的参考。它不用于实际代码。
U1
没有任何选择器(它没有字段,所以不能)。我不知道你的意思。@dfeur谢谢你的反馈或
U1
我的意思是,对于一个特定的构造函数,它没有选择器。我还在想一个更好的名字。