gpt4 book ai didi

haskell - 了解 'newtype' 关键字

转载 作者:行者123 更新时间:2023-12-01 22:50:26 28 4
gpt4 key购买 nike

对于 uni 赋值,我们得到了一行 Haskell 代码,其中显示:

newtype TC a = TC ([Id] -> Either TypeError ([Id], a))

首先,TypeError 是我们需要为赋值实现的东西,所以我不能在这里发布数据声明,但我的问题是这样的。我如何阅读上面的代码? newtype TC 后面的a 是什么?我也不明白 TC 是如何在等号右边重复使用的。

我认为这里的 a 是一个类型变量,因为 newtype 的工作方式类似于数据。我不知道知道这一点对我的理解有何帮助。

最佳答案

What is the a right after the newtype TC?

newtype声明中的a

newtype TC a = ...

与函数声明中的x 表达的非常相似

f x = ...

a 是类型参数。因此,您将能够使用 TC,例如 TC IntTC Bool,类似于您能够使用的方式f 类似于 f 1f "bla bla"(取决于其类型)。

case TC Int 等效于以下替代方案:

newtype TCInt = TCInt ([Id] -> Either TypeError ([Id], Int))

I also don't understand how TC is being reused to the right of the equals sign.

这在 Haskell 中是一个令人困惑的怪癖。实际上,TC 被重用,而是您声明了两个独立的 实体,它们都被称为TC。你也可以用不同的方式调用它们:

newtype TC_T a = TC_V ([Id] -> Either TypeError ([Id], a))
  • TC_T 是一个类型构造函数。这是将出现在类型签名中的东西,即 TC_T IntTC_T Bool
  • TC_V 是一个值构造函数。当生成 TC_T IntTC_T Bool 类型的值时,您会用到它。

例如,您可以这样写:

tci :: TC_T Int
tci = TC_V (\ids -> Right (ids, 37))

tcb :: TC_T Bool
tcb = TC_V (\ids -> Right (reverse ids, False))

您的原始版本看起来像这样:

tci :: TC Int
tci = TC (\ids -> Right (ids, 37))

tcb :: TC Bool
tcb = TC (\ids -> Right (reverse ids, False))

...但它仍然是两个独立的东西,都在这里称为 TV。 Haskell 中的大多数新类型调用相同的类型和值构造函数,但通常只有类型构造函数从模块中导出,而值构造函数作为实现细节保留。

datanewtype 的大部分内容是相同的。你也可以拥有

data TC a = TC ([Id] -> Either TypeError ([Id], a))

...与 newtype 版本的唯一区别是一个微妙的间接寻址:如果它是 data,那么编译器会插入一个允许更多惰性的间接寻址,但在这种情况下几乎没有意义这样做。

在实践中,您通常只在需要多个 构造函数和/或具有多个字段的构造函数时才使用data,而newtype 不需要支持。

关于haskell - 了解 'newtype' 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74458089/

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