2017-07-01 52 views

回答

2

这是DataKinds行动,其中:

  • 升降机在类型级别值,并
  • 列表类型的那种级别

但是这会造成类型级别的混淆。现在,在类型,[X]可能要么是[X] :: *,列表-OF- X型,或者相反,我们可能有[X] :: [T]由于提升 - 这是价值[X](只含单一数值X列表),类型的XT,在类型级别解除。

为了克服这种不明确性,GHC需要在提升值构造函数前面引用一个引号。所以,我们有[X] :: *'[X] :: [T]

具体而言,在您的情况下,Get '[JSON] [User]涉及将列表值[JSON]提升到类型级别,并且列表类型为[User]。为了更好地理解差异,请注意,'[JSON]类型没有(有用的)术语,因为这不是列表类型。我们甚至可以有Get '[JSON,JSON,JSON] [User]作为一个好主意的表达,甚至Get '[] [User]。相反,我们不能有Get '[JSON] [User,User],因为[User,User]不是一种类型。

(类型Get '[JSON,JSON,JSON] [User],即使它是有效的,不可能进行有意义使用的仆人库。我没有在仆人使用的解禁名单什么的想法。)

5

引号用于区分类型级构造函数与提升类型的术语级构造函数。

例如:

{-# LANGUAGE DataKinds #-} 

data Which = One | Two 

myPick :: Which -- Type 
myPick = One 

type MyPick :: Which -- Kind 
type MyPick = 'One 

顺便说一句,那种注释type MyPick :: Which是无效的Haskell,但它给你术语和类型级别的对应关系的想法。你可以得到这个最接近需要开启另一分机:

{-# LANGUAGE TypeFamilies #-} 

type family MyPick :: Which where 
    MyPick = 'One