Haskell-多态性和值取决于类型
通过阅读维基百科的条目,当应用到Haskell时,我的理解是Haskell-多态性和值取决于类型,haskell,polymorphism,lambda-calculus,type-families,Haskell,Polymorphism,Lambda Calculus,Type Families,通过阅读维基百科的条目,当应用到Haskell时,我的理解是 按术语索引的术语族-从值到值的典型函数 按类型-索引的术语族 按类型索引的类型族-类型构造函数中的参数多态性,类型族 由术语索引的类型族-pi类型(在Haskell中使用单例类型)、sigma类型等 如果我把上面列出的例子弄错了,请纠正我。引用维基百科的那篇文章: 术语取决于类型或多态性。系统F,又名二阶lambda演算(在图中写为λ2),仅通过施加此属性获得 我不知道哈斯克尔是如何从上面理解这一点的。Haskell在术语和类型以
- 术语取决于类型或多态性。系统F,又名二阶lambda演算(在图中写为λ2),仅通过施加此属性获得
typeof(a)
或b.GetType()
,然后在运行时根据类型信息返回一些值
因此,在哈斯凯尔书中,我能想到的关于(2)的唯一一件事是
中sayData.Monoid
中的返回类型多态性,其中值取决于实例类型mempty
- 数据族,其中在LHS上采用类型,在RHS上采用值构造函数
Right 3::对于所有a。Num b=>a b之一
当他们缺少适合这张图片的类型上下文时?我猜这是(2)个按类型索引的术语的示例 在lambda多维数据集中,这是参数多态性 在SystemF中,多态项看起来像以类型作为参数和返回项的函数
id : ∀ a. a -> a
id = Λa . λx : a . x -- Λ binds type args, λ binds term args
可以通过将它们显式应用于类型来实例化它们:
boolId : Bool -> Bool
boolId = id Bool
在Haskell中,面向用户的语言没有显式的类型应用程序和抽象,因为类型推理可以在大多数(但不是所有)情况下填充细节。相比之下,GHC核心(GHC Haskell的中间语言)与系统F非常相似,并且具有类型应用程序
类型擦除与我们是否可以按类型索引项是正交的。在Haskell中,类型可以从运行时中删除,但我们可以想象其他没有统一大小的运行时对象的语言,因此它们需要保留类型(或大小信息)
按类型索引的类型
在lambda多维数据集意义上,这意味着拥有从类型和类型构造函数到类型和类型构造函数的函数
Haskell没有类似的功能。类型族最接近,但它们都是
类型类和lambda立方体
类型类是不在lambda多维数据集中建模的奇怪野兽。在Haskell中,它们被分解成函数和字典传递,所以它们甚至没有出现在GHC核心中。它们可以被看作是程序的某种预处理,依赖于实例的自我强加唯一性来确定地填充细节 感谢您的解释和康纳答案的有用链接。所以我想说的是,lambda立方体仅仅是对基础lambda演算的不同扩展的偏序集。还有其他扩展,如Fc[其中类型族与Fω有些相似,但不完全相似],或OO中的子类型多态性。简而言之,lambda多维数据集总结了是否允许从X到Y的函数,其中X和Y可以是“类型”或“术语”。仅供参考,这是lambda多维数据集的一个简洁的教程实现,通过允许/禁止抽象,您可以轻松地在多维数据集的各个点之间移动。谢谢!我到家后会读的。因此,lambda cube实际上在种类级别和更高级别上没有任何作用,尽管这可能不是必需的。至于数据族,即使它们更类似于按类型索引的开放GADT,您如何对它们进行分类?给定数据族DF t::*,由于注入性,
DF::*->*
是正确的。因此,我们不能说数据族与类型族(3)不同。我被困在类型族的RHS本身就是类型,而数据族的RHS是值构造函数的部分。