在Haskell中,列表前面的撇号(';[Something])是什么意思?
我在读《仆人》时遇到了这样一句话:在Haskell中,列表前面的撇号(';[Something])是什么意思?,haskell,servant,Haskell,Servant,我在读《仆人》时遇到了这样一句话: type UserAPI = "users" :> QueryParam "sortby" SortBy :> Get '[JSON] [User] ”对该列表做了什么 引号用于区分类型级构造函数与升级类型的术语级构造函数 例如: {-# LANGUAGE DataKinds #-} data Which = One | Two myPick :: Which -- Type myPick = One type MyPick :: Whic
type UserAPI = "users" :> QueryParam "sortby" SortBy :> Get '[JSON] [User]
”
对该列表做了什么 引号用于区分类型级构造函数与升级类型的术语级构造函数
例如:
{-# LANGUAGE DataKinds #-}
data Which = One | Two
myPick :: Which -- Type
myPick = One
type MyPick :: Which -- Kind
type MyPick = 'One
顺便说一下,种类注释typemypick::Which
不是有效的Haskell,但它让您了解术语和类型级别之间的对应关系。要最接近这一点,需要打开另一个扩展:
{-# LANGUAGE TypeFamilies #-}
type family MyPick :: Which where
MyPick = 'One
这是正在运行的
数据种类
,它:
- 提升类型级别的值,以及
- 将类型提升到种类级别
[X]
可能是[X]:*
,也可能是-X
类型的列表,或者相反,由于提升,我们可能有[X]::[T]
,即值[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]
,即使它是有效的,也不能被Servant库有意义地使用。我不知道提升列表在Servant中用于什么。)(有用)“[JSON]
根本不是一种类型,不应该有这种“类型”的任何术语。@luqui Right。我可能想的是底部,这里不适用。修正。一篇与此相关的伟大文章:另一篇伟大的文章: