[英]using list types with Haskell's -XDataKinds
我在函数中使用了返回类型(使用包haskell-src-exts
):
import Language.Haskell.Exts.Syntax (Exp(..))
import Language.Haskell.Exts.SrcLoc (SrcSpanInfo(..))
:k Exp SrcSpanInfo
Exp SrcSpanInfo :: *
那是一种。 到现在为止还挺好。
但现在我想更好地输入它:
:set -XDataKinds
> :k 'List
'List :: l -> [Exp l] -> Exp l
所以,这东西想要更多的东西。 很好,我可以做到。
> :k 'List SrcSpanInfo
'List SrcSpanInfo :: [Exp *] -> Exp *
一步之遥。 好的。
> :k 'List SrcSpanInfo [Exp SrcSpanInfo]
<interactive>:1:19: error:
• Expected kind ‘[Exp *]’, but ‘[Exp SrcSpanInfo]’ has kind ‘*’
• In the second argument of ‘ 'List’, namely ‘[Exp SrcSpanInfo]’
In the type ‘ 'List SrcSpanInfo [Exp SrcSpanInfo]’
在这一点上,我感到很困惑。 对我来说,感觉就像我给它的东西绝对是它所要求的。 究竟是什么意思?
从评论中,我突然想到您实际上可能不是在寻找提升类型(即种类),而是在寻找常规类型。
从评论(特别是:“...所需种类* ...”)看来,您似乎只是想构造一个Exp SrcSpanInfo
类型的值(实际上,这些类型实际上并不用于种类级别的使用) .
为此,只需将参数应用于构造函数:
> span = noInfoSpan $ mkSrcSpan noLoc noLoc
> :t span
span :: SrcSpanInfo
> list = List span []
> :t list
list :: Exp SrcSpanInfo
原答案
表达式[Exp SrcSpanInfo]
并不表示“具有单个元素Exp SrcSpanInfo
的类型级别列表”,而是表示“一个类型为Exp SrcSpanInfo
类型元素列表的单一类型”,类似于[Int]
或[String]
。
编译器无法区分前者和后者,因此它默认使用较旧的、更标准的解释。
为了让它看到一个类型级别的列表,它必须用单引号引用,就像你对'List
所做的那样。
此外, Exp
是一种类型,但是当用于种类签名时,它被提升为一种类型。 为了构造一种Exp *
类型,您必须使用它的一个构造函数。 我将使用List
构造函数,因为它最容易实例化:
> :k 'List SrcSpanInfo '[ 'List SrcSpanInfo '[] ]
[a]
是列表的类型。 要构建(提升)列表,请编写'[a]
:
:k 'List SrcSpanInfo '[ 'List Int '[] ]
将'List
应用于类型,例如SrcSpanInfo
,可能也不是您想要的(希望我的示例也将它应用于Int
表明某些事情已关闭)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.