Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Haskell中,列表前面的撇号(';[Something])是什么意思?_Haskell_Servant - Fatal编程技术网

在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。我可能想的是底部,这里不适用。修正。一篇与此相关的伟大文章:另一篇伟大的文章: