[英]GHCI asking for type or value namespaces?
当向GHCI
请求type
或info
,哪个名称空间用于名称和表达式?
:type <expr> show the type of <expr>
:info[!] [<name> ...] display information about the given names
(!: do not filter instances)
我不确定我要什么,以下签名是什么意思。
Prelude Control.Monad.State> :t StateT
StateT :: (s -> m (a, s)) -> StateT s m a
在响应行中,第一个StateT
来自值名称空间,第二个来自类型名称空间?
:t
[ ype
]始终使用值名称空间 :k
[ ind
]始终使用类型名称空间 :i
[ nfo
]两者都使用,显示所有匹配的标识符。 例如,
Prelude> data Q = A Prelude> data A = Q Prelude> :i Q data A = Q -- Defined at <interactive>:5:10 data Q = A -- Defined at <interactive>:4:1
由于仅要求表达式的类型有意义,因此您可以确信:t StateT
使用表达式名称空间。 同样,在类型说明/声明foo :: bar
,左侧foo
始终是表达式,而右侧bar
始终是类型。 正如您所说,
StateT :: (s -> m (a, s)) -> StateT s m a
第一个StateT
来自表达式名称空间,第二个StateT
来自类型名称空间。 如果要询问类型级别表达式的“类型”,可以使用:kind
命令(或简称为:k
),在这种情况下,参数始终是类型级别表达式。 从而:
Control.Monad.State> :k StateT
StateT :: * -> (* -> *) -> * -> *
这里::
表示种类 ,因此在foo :: bar
, foo
是类型级别的表达式,而bar
是种类级别的表达式。
通常,可以完全语法上分辨出给定名称来自哪个名称空间,但:info
命令有点特殊。 当您要求提供有关出现在两个名称空间中的名称的信息时,它将为您提供有关这两个名称空间的信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.