首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WAI中的ResponseReceived数据类型

WAI中的ResponseReceived数据类型
EN

Stack Overflow用户
提问于 2018-10-23 16:55:02
回答 1查看 70关注 0票数 0

我想知道,为什么WAI的Aplication类型被设计成Request -> (Response -> IO ResponseReceived) -> IO ResponseReceived。为什么不是Request -> (Response -> IO ()) -> IO ()?医生说

表示WAI处理程序已收到响应的特殊数据类型。这是为了避免在应用程序的定义中使用Rank2Types。 强烈建议只有WAI处理程序为该数据类型导入和使用数据构造函数。

这种特殊的数据类型如何帮助避免Rank2Types

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-23 17:52:44

Application真的应该是

代码语言:javascript
复制
type Application = Request -> (forall b. (Response -> IO b) -> IO b)
-- a.k.a. Request -> Codensity IO Response
-- newtype Codensity f a = Codensity { runCodensity :: forall b. (a -> f b) -> f b }
-- which is closely related to continuations

也就是说,Application接受一个Request,一个函数f,它用一个Response调用f

代码语言:javascript
复制
app :: Application
app req f = f _resp

Application强迫你打电话给f。除了IO b之外,没有其他函数能够在app中生成f,因此,由于app必须生成IO b,所以app必须调用fwai依赖于app调用f,它可以使用这个Application强制执行它。然而,Application排名较高,这有点不可取.

实际使用的解决方案是:

代码语言:javascript
复制
type Application = Request -> (Response -> IO ResponseReceived) -> IO ResponseReceived
-- a.k.a. Request -> ContT ResponseReceived IO Response
-- in general, ContT is "bigger" and "weaker" than Codensity
-- but, in exchange, does not require higher ranked types

app :: Application
app req f = f _resp

f仍然是app手头唯一可以生成ResponseReceived的东西,只要app不打破它与wai的契约并导入构造函数。您不能用ResponseReceived替换()。每个人和他们的母亲都有可用的()构造函数(())。我不认为没有它是不可能的。这使得它不适合于Application

代码语言:javascript
复制
type Application = Request -> (Response -> IO ()) -> IO ()
app :: Application
app _ _ = return () -- uh oh
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52954218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档