haskell - Haskell 支持哪些多态类型?

标签 haskell types polymorphism

阅读维基百科对 polymorphism 的定义,我提出一个问题:

Haskell 支持哪些多态类型,哪些不支持?

看起来维基百科不包含一些多态类型的描述,如 Levity Polymorphism这对我来说是新的,并在 Haskell 中得到支持。

我想知道 Haskell Polymorphism 的扩展列表接着举例深入探讨。

看起来主要的两个是:

  • 参数多态
  • 临时多态性
  • 最佳答案

    在当前的 Haskell 中,至少有四件事可以算作多态性:

  • 参数多态性。 (还有 kind polymorphism ,类型中的多态性而不是类型。我猜这是上一级的参数多态性,所以我不把它算作一个单独的条目。)
  • 临时多态性,由类型类启用的多态性。介绍于How to make ad-hoc polymorphism less ad hoc纸。
  • Structural polymorphism .这是generics启用的那个.一个函数可以处理具有不同数量的字段和构造函数的多种数据类型。例如,记录的通用相等函数。
  • Levity polymorphism .多态性调用约定/类型的运行时表示。 Levity Polymorphism 中描述纸。

  • 在 Haskell 的 future 版本中可能会引入另外两种类型的多态性:
  • 匹配性多态性。将允许高阶类型族使用类型构造函数和类型族作为参数。论文中描述的Higher-order Type-level Programming in Haskell .
  • 多重性多态性。将允许高阶函数同时使用普通函数和线性函数作为参数。论文中描述的Linear Haskell Practical Linearity in a Higher-Order Polymorphic Language .

  • 有人可能会问,为什么会有这么多的多态性? Haskell 中似乎存在一个总体设计原则,即只要可以通过子类型化或多态性解决某些挑战,就应该首选多态性。

    例如,来自 levity 多态性论文:

    We can now present the main idea of the paper: replace sub-kinding with kind polymorphism.



    从介绍匹配性多态性的论文中:

    At first you might think that we need subtyping, but instead we turn to polymorphism



    来自线性 Haskell 论文:

    The lack of subtyping is a deliberate choice in our design



    西蒙·佩顿·琼斯本人在 47:00 上指出了这一点在 this talk .

    Whenever you want to use subtyping, use polymorphism instead.

    关于haskell - Haskell 支持哪些多态类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56326016/

    相关文章:

    haskell - Haskell 中按名称调用与按值调用

    haskell - 使用种类签名和类型运算符进行类型级算术?

    haskell - 非常规递归类型的变态(折叠)类型是什么?

    Golang 类型系统不一致(http包)

    c++ - 多态性->错误 : 'no known conversion from derived class to base class'

    Haskell 创建一个具有特定增量的列表

    haskell - 用haskell匹配正整数

    PHP - ini_set() 期望参数 2 是字符串,给定整数

    C++,合适的数据模型,多态性

    java - 如何将实现接口(interface)的类添加到 ArrayList