我想知道,为什么WAI的Aplication类型被设计成Request -> (Response -> IO ResponseReceived) -> IO ResponseReceived。为什么不是Request -> (Response -> IO ()) -> IO ()?医生说
表示WAI处理程序已收到响应的特殊数据类型。这是为了避免在应用程序的定义中使用Rank2Types。 强烈建议只有WAI处理程序为该数据类型导入和使用数据构造函数。
这种特殊的数据类型如何帮助避免Rank2Types
发布于 2018-10-23 17:52:44
Application真的应该是
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。
app :: Application
app req f = f _respApplication强迫你打电话给f。除了IO b之外,没有其他函数能够在app中生成f,因此,由于app必须生成IO b,所以app必须调用f。wai依赖于app调用f,它可以使用这个Application强制执行它。然而,Application排名较高,这有点不可取.
实际使用的解决方案是:
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 _respf仍然是app手头唯一可以生成ResponseReceived的东西,只要app不打破它与wai的契约并导入构造函数。您不能用ResponseReceived替换()。每个人和他们的母亲都有可用的()构造函数(())。我不认为没有它是不可能的。这使得它不适合于Application。
type Application = Request -> (Response -> IO ()) -> IO ()
app :: Application
app _ _ = return () -- uh ohhttps://stackoverflow.com/questions/52954218
复制相似问题