我读的仆人documentation和跨越这条线进来:Haskell中列表前的撇号('[Something])是什么意思?
type UserAPI = "users" :> QueryParam "sortby" SortBy :> Get '[JSON] [User]
什么是'
做这一名单?
我读的仆人documentation和跨越这条线进来:Haskell中列表前的撇号('[Something])是什么意思?
type UserAPI = "users" :> QueryParam "sortby" SortBy :> Get '[JSON] [User]
什么是'
做这一名单?
这是DataKinds
行动,其中:
但是这会造成类型级别的混淆。现在,在类型,[X]
可能要么是[X] :: *
,列表-OF- X
型,或者相反,我们可能有[X] :: [T]
由于提升 - 这是价值[X]
(只含单一数值X
列表),类型的X
T
,在类型级别解除。
为了克服这种不明确性,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]
,即使它是有效的,不可能进行有意义使用的仆人库。我没有在仆人使用的解禁名单什么的想法。)
引号用于区分类型级构造函数与提升类型的术语级构造函数。
例如:
{-# 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