Haskell 为什么不是';GHCi让我用种类标注我的类型?
我在阅读Haskell论文的历史记录时发现了一些种类,并尝试在上运行一些示例 当我这样做时,我得到了错误Haskell 为什么不是';GHCi让我用种类标注我的类型?,haskell,ghc,Haskell,Ghc,我在阅读Haskell论文的历史记录时发现了一些种类,并尝试在上运行一些示例 当我这样做时,我得到了错误 Prelude> Int :: * [3/1792] <interactive>:1:8: error:
Prelude> Int :: * [3/1792]
<interactive>:1:8: error:
Not in scope: type constructor or class ‘*’
<interactive>:1:8: error:
Illegal operator ‘*’ in type ‘*’
Use TypeOperators to allow operators in types
Prelude>Int::*[3/1792]
:1:8:错误:
不在范围内:类型构造函数或类'*'
:1:8:错误:
类型'*'中的运算符'*'非法
使用TypeOperators允许在类型中使用运算符
我不认为“导入”类型运算符会有帮助,因为我认为GHCi认为*是乘法运算符,当我希望它表示一种类型时
似乎表明我的GHC版本中可能还没有添加种类。会是这样吗
我使用的是GHCi版本8.0.2(来自Ubuntu 18.04软件包管理器)。要检查GHCi中的种类,您可能需要使用以下内容
> :set -XKindSignatures
> :k (Int :: *)
(Int :: *) :: *
或者省略::*
部分,让:k
为您解决这个问题
直接键入
Int::*
将使GHCi将Int
解释为值表达式,并查找不存在的值构造函数Int
。它还将*
解释为一种类型,而不是一种导致错误的类型。这不是一种类型定义。类型定义以数据
或新类型
等开头。您好,我不确定类型定义在这里的相关性。Int是一种类型,我想用一种。我直接从Haskell wiki中获取了一行Int::*
。@overseasInt
不是一个值或声明,因此您不能只在GHCi中编写Int:*
。您需要告诉GHCi您正在编写一个类型,例如通过data
或newtype
定义一个类型,或使用:k
命令。谢谢!这和我想要的很接近。对不起,我很迟钝,但是为什么“Int”被解释为一个值表达式呢?我认为Int是一种类型。这是因为(foo::bar)在默认情况下总是被GHCi解释为(valueexpr::sometype)?@是的,正是出于这个原因。我们可以定义data T=Int派生Show
,然后询问GHCiInt::T
。Haskell最初是用两个不同的名称空间为值构造函数和类型定义的。之后才添加了T::*
中的种类语法,在GHCi中需要:k
。在Haskell源文件中,它只能出现在精确的上下文中,例如类型定义数据A(f::*->*)=A(f Bool)
,其中::
显然处于种类级别。我不知道数据类型的值构造函数的名称可能是另一个数据类型的名称(参考数据t=Int
)。这似乎很危险,因为如果我输入数据R=R;数据L=R;x=R
并查询x的类型,我得到的结果是x::L
(因此R被L遮蔽了?。@这实际上在同一模块中是禁止的,因为R
在值级别使用了两次。在GHCi中,使用了一些“魔法”来实现这一点,假装每个定义大致都在一个单独的模块中。这就是为什么在GHCi中,您可以先执行x=True
,然后执行x=False
,然后执行x=“hello”
,这看起来是一种重新定义。