簡體   English   中英

在 Haskell 的 -XDataKinds 中使用列表類型

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM