- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
a -> a .类似地,类-6ren">
在 Haskell 中,(值级)表达式分为类型,可以用 ::
表示。像这样:3 :: Int
, "Hello" :: String
, (+ 1) :: Num a => a -> a
.类似地,类型被分类为种类。在 GHCi 中,您可以使用命令 :kind
检查类型表达式的种类。或 :k
:
> :k Int
Int :: *
> :k Maybe
Maybe :: * -> *
> :k Either
Either :: * -> * -> *
> :k Num
Num :: * -> Constraint
> :k Monad
Monad :: (* -> *) -> Constraint
*
是一种“具体类型”或“值”或“运行时值”。例如,参见
Learn You A Haskell .这有多真实?我们有
a few
questions
about kinds顺便解决了这个话题,但最好能对
*
有一个规范和准确的解释。 .
*
到底是什么意思?意思是?它与其他更复杂的类型有什么关系?
DataKinds
或
PolyKinds
扩展改变答案?
最佳答案
首先,*
不是通配符!它通常也发音为“明星”。
出血边缘注释:截至 2015 年 2 月 a proposal to simplify GHC's subkind system (in 7.12 or later) .该页面包含对 GHC 7.8/7.10 故事的精彩讨论。展望 future ,GHC 可能会放弃类型和种类之间的区别,* :: *
.见 Weirich, Hsu, and Eisenberg, System FC with Explicit Kind Equality .
标准:类型表达式的描述。
Haskell 98 报告 defines *
in this context as :
The symbol
*
represents the kind of all nullary type constructors.
Either
是二进制的;它可以应用于两个参数:
Either a b
.
Maybe
是一元的;它可以应用于一个参数:
Maybe a
.
Int
是无效的;它可以应用于无参数。
*
,例如
Maybe Int :: *
.
*
'是一种装箱值。像
Int
和
Maybe Float
这样的东西有
*
。”
GHC user's guide for version 7.4.1 ,另一方面,表示
*
是那种“举起的类型”。 (当该部分被修改时,该段落没有保留
PolyKinds
.)
A type is unboxed iff its representation is other than a pointer. Unboxed types are also unlifted.
A type is lifted iff it has bottom as an element. Closures always have lifted types: i.e. any let-bound identifier in Core must have a lifted type. Operationally, a lifted object is one that can be entered. Only lifted types may be unified with a type variable.
ByteArray#
,原始内存块的类型,因为它被表示为指针而被装箱,但因为底部不是元素而未被提升。
> undefined :: ByteArray#
Error: Kind incompatibility when matching types:
a0 :: *
ByteArray# :: #
因此,旧的用户指南定义似乎比 GHC 评论更准确:
*
是那种提升的类型。 (相反,
#
是未提升的类型。)
*
总是被提升,对于任何类型
t :: *
你可以用
undefined :: t
构造一个“值”或其他一些创建底部的机制。因此,即使是“逻辑上无人居住”的类型,如
Void
可以有一个值,即底部。
*
表示可以包含运行时值的类型,如果
undefined
是您对运行时值(value)的看法。 (这不是一个完全疯狂的想法,我不认为。)
KindSignatures
让我们编写类型注释,如类型注释。
ConstraintKinds
加样
Constraint
,大致就是
=>
左侧的那种.
DataKinds
让我们介绍
*
以外的新品种和
#
,就像我们可以用
data
引入新类型一样,
newtype
, 和
type
.
DataKinds
每
data
声明(可能适用条款和条件)生成提升的种类声明。所以
data Bool = True | False
介绍了常用的值构造函数和类型名称;此外,它还产生了一种新类型,
Bool
, 和两种类型:
True :: Bool
和
False :: Bool
.
PolyKinds
引入种类变量。这只是一种说“对于任何类型
k
”的方式,就像我们在类型级别说“对于任何类型
t
”一样。至于我们的 friend
*
以及它是否仍然意味着“具有值的类型”,我想你可以说一个类型
t :: k
在哪里
k
是一种可以包含值的变量,如果
k ~ *
或
k ~ #
.
关于haskell - Haskell 中的 "*"到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27095011/
这对你们来说可能很简单,但由于我是java新手,所以我想知道实际上什么是 接下来的部分会发生什么? if (args.length > 0) { file = args[0]; } publi
在我的 View Controller 中,我将 UITapGestureRecognizer 添加到 self.view。我在 self.view 之上添加了一个小 View 。当我点击小 View
我今天尝试从 Obj-C 开始并转到 Swift,我正在阅读文档。我试图在 Swift 中创建一个简单的 IBOutlet,但它不断给我这些错误。 View Controller 没有初始化器 req
我正在尝试使用 VIM 完成(字典和当前缓冲区),但我遇到了问题?和 !在方法名称的末尾。我能以某种方式向 vim 解释方法名称(基本上是单词)最后只能有它,而且只有一个,即 method_name
我是一名优秀的程序员,十分优秀!