[英]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.