- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于 uni 赋值,我们得到了一行 Haskell 代码,其中显示:
newtype TC a = TC ([Id] -> Either TypeError ([Id], a))
首先,TypeError
是我们需要为赋值实现的东西,所以我不能在这里发布数据声明,但我的问题是这样的。我如何阅读上面的代码? newtype TC
后面的a
是什么?我也不明白 TC
是如何在等号右边重复使用的。
我认为这里的 a
是一个类型变量,因为 newtype
的工作方式类似于数据。我不知道知道这一点对我的理解有何帮助。
最佳答案
What is the
a
right after thenewtype TC
?
newtype声明中的a
newtype TC a = ...
与函数声明中的x
表达的非常相似
f x = ...
a
是类型参数。因此,您将能够使用 TC
,例如 TC Int
或 TC Bool
,类似于您能够使用的方式f
类似于 f 1
或 f "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 Int
或 TC_T Bool
。TC_V
是一个值构造函数。当生成 TC_T Int
或 TC_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 中的大多数新类型调用相同的类型和值构造函数,但通常只有类型构造函数从模块中导出,而值构造函数作为实现细节保留。
data
和 newtype
的大部分内容是相同的。你也可以拥有
data TC a = TC ([Id] -> Either TypeError ([Id], a))
...与 newtype 版本的唯一区别是一个微妙的间接寻址:如果它是 data
,那么编译器会插入一个允许更多惰性的间接寻址,但在这种情况下几乎没有意义这样做。
在实践中,您通常只在需要多个 构造函数和/或具有多个字段的构造函数时才使用data
,而newtype
不需要支持。
关于haskell - 了解 'newtype' 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74458089/
这个问题在这里已经有了答案: Casting vs using the 'as' keyword in the CLR (18 个答案) 关闭 2 年前。 这两个转换之间究竟有什么区别? SomeC
如何将 newtype 转换为 Int,反之亦然? 我尝试过: newtype NT1 = NT1 Integer fromNT1toInt :: NT1 -> Int fromNT1toInt x
真实世界的haskell 说: we will hide the details of our parser type using a newtype declaration 我不明白我们如何使用新类
我想定义一种“理想”类型,它是一个列表,但有一些结构。数字前奏已经定义了 Ring 的实例对于列表,但他们没有使用我想要的加法和乘法的定义。所以我认为在这种情况下我应该说 newtype Ideal
我正在用 SAT 做一些事情,我想要同时有“and”和“or”子句。 type AndClause = [Literal] type OrClause = [Literal] 但是我在使用它们时遇到
给定以下新类型: newtype Bar a = Bar { biz::Int -> Int -> Int } 是否可以对 Int -> Int 参数进行模式匹配? 例如,假设我想在 Bar 上对 m
我正在尝试理解 newtype 并认为这会起作用: module NT where newtype X = X Double newtype Y = Y Double doit :: X -> Y -
考虑以下代码示例,它创建了一个新类型来表示客户模型: module Main where import Effect (Effect) import Effect.Console ( logShow
假设我有这个新类型: newtype SomeType a = SomeType { foo :: OtherType a } 我要确保a是可显示的(属于类型类 Show x )。 我如何确保? (这
我有一个类型 class IntegerAsType a where value :: a -> Integer data T5 instance IntegerAsType T5 where v
Learn You a Haskell讨论 newtype . 它的签名如何Pair b a意味着传入的参数必须是一个元组? ghci> newtype Pair b a = Pair { getPa
我有兴趣为我的 monad 转换器堆栈获得缩放功能,该功能定义如下: newtype Awesome a = Awesome (StateT AwesomeState (ExceptT B.ByteS
我创建了一个 newtype为 Maybe Int : Prelude> newtype MaybeTuple = MaybeTuple { getMaybe :: Maybe Int} Prelud
这有什么区别: INPUT_FORMAT_TYPE = NewType('INPUT_FORMAT_TYPE', Tuple[str, str, str]) 和这个 INPUT_FORMAT_TYP
我有一个 UndecidableInstances我无法弄清楚如何避免使用 newtype 的问题.这是我最初的: {-# LANGUAGE TypeFamilies, FlexibleContext
我有一个 Haskell 项目,它使用了几个 newtypes . 我想导出这些表格,因此我可以将它包含在我的文档(非黑线鳕)中,例如作为 Markdown 表。我对此并不熟悉,但通过阅读,我的计划是
通常情况下,我正在编写剥离新类型的唯一构造函数的函数,例如在以下函数中返回不是 Nothing 的第一个参数: process (Pick xs) = (\(First x) -> x) . mcon
我最近在学习 PureScript,并做了一个在屏幕上绘制立方体的小应用程序。一切顺利,我在 Main 模块的顶部定义了一些 newtype,如下所示: newtype Vec2 = Vec2
Rewrite rules可以帮助您优化程序。我想知道如果我将对象包裹在 newtype 中它们是否会起作用.众所周知,newtype不会带来性能损失,它是一个在运行时消失的编译时包装器。所以我想知道
Difference between `data` and `newtype` in Haskell还有其他几个问题解决了数据和新类型之间的一般差异。我的问题是一个非常具体的问题。如果 G是某种类型,
我是一名优秀的程序员,十分优秀!