gpt4 book ai didi

haskell - 不是类型构造函数的类型级函数示例

转载 作者:行者123 更新时间:2023-12-04 10:33:57 25 4
gpt4 key购买 nike

与其他类型级函数相比,Haskell 中的“类型构造函数”概念有何独特之处?

据我所知,他们:

  • 允许用户在编译期间对其应用参数
  • 在提供有限数量的参数
  • 后生成简单类型(例如,不是约束)

    最佳答案

    短语“类型构造函数”有两种常见用法。有些人将它们用于任何带有箭头的类型;但是 Haskell 报告以不同的方式非常一致地使用它,所以我将讨论这个定义。

    构造函数由 data 创建和 newtype声明,并且是这些声明在类型级别引入的单个新名称。以下是类型构造函数的一些示例:

    Either
    Maybe
    []
    Bool

    哎呀,你注意到最后一个了吗?没错,“类型构造函数”这个短语并没有暗示它必须能够接受参数。 Bool是由数据声明引入的类型级别名称 - 因此是类型构造函数。以下是一些不是构造函数的类型示例:
    Maybe Int
    a -> b
    Either ()
    m -- even if we know, say, Monad m holds

    哎呀,你注意到最后两个了吗?没错,在另一个方向上,没有什么可以让你成为类型构造函数的更多类型参数。 Either 中的每一个和 ()是构造函数,但 Either 的应用至 ()不是,因为它不是由 data 创建的单个类型级别名称。或 newtype宣言。同样, m是一个类型变量,而不是构造函数——它的含义不是由任何 data 固定的。或 newtype宣言。

    除了构造函数和变量,标准 Haskell 中还有另一种类型级别的名称:类型别名。类型别名和构造函数之间有两个主要区别:
  • 构造函数是单射的,别名可能不是。如果 FooC a b cFooC a' b' c'是同一类型,FooC是构造函数,则 aa'是同一类型,bb'是同一类型,cc'是同一类型。对比
    type FooA a = String

    其中FooA ()FooA Bool是同一类型,即使 ()Bool不是同一类型。
  • 可以部分应用构造函数,不能应用类型别名。例如,如果你写
    type BarA a = Maybe a

    然后 StateT Int BarA ()无效 -- BarA必须总是立即给出它的类型参数 -- 即使 StateT Int Maybe ()是。当然,与
    type BarEtaA = Maybe

    然后 StateT Int BarEtaA ()再次有效,因为别名 BarEtaA在扩展到其定义的 Maybe 值之前不需要任何参数.

  • 别名和构造函数之间还有一些其他小的差异,但它们不是基本的(并且可以通过合适的 GHC 扩展来放松)。

    我可以在标准 Haskell 中想到的构造函数和变量之间只有一个区别,即它们与类型类机制的交互。具体来说,实例的格式必须为 instance <class> (<constructor> <variable> <variable> <variable> ...) where ...。并且约束/上下文必须是 <class> (<constructor> <variable> <variable> ...) => ... 的形式.适当的 GHC 扩展可以放宽这些限制。

    GHC 实现的扩展 Haskell 还包括其他两种形式的已定义类型级名称,类型族和数据族,它们混合了上述一些属性。数据族定义的名称与构造函数非常相似(它们是单射的,可以部分应用),而类型族定义的名称与别名非常相似(它们不保证是单射的,不能部分应用)。主要区别在于他们可以进行“类型级别的模式匹配”,其中有多个定义适用于不同的情况。完整的描述可能不适合 StackOverflow 的答案,但是 the manual describes them并链接到讨论它们的几篇冗长的论文。

    关于haskell - 不是类型构造函数的类型级函数示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52021770/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com