在clojure,我可以写这样的东西:
(defn wrap-my-header
[handler]
(fn [request]
(let [request (if (get-in request [:headers "my-header"])
(assoc request :has-my-header? true)
request)]
(handler request))))
Run Code Online (Sandbox Code Playgroud)
在这个中间件,我检查,如果我在有一个非空值my-header的:headers,如果是,我将在附加一些数据request映射.这表明我可以对待request并response作为一种有点"有状态"的数据.
我仍然是哈斯克尔的新人,并且想做类似的事情scotty.在查看中间件的类型后,我可以创建这样的中间件:
myMiddleware :: Middleware
myMiddleware app req respond = app req respond
Run Code Online (Sandbox Code Playgroud)
在长时间盯着这个类型后,我仍然不知道该怎么做.一些阅读和思考让我认为这是不可能的,Middleware只能使处理程序短路和/或改变生成的响应.这是真的?
在 nix 中,overlay 是一个带有 2 个参数的函数:self和super。基于手册,self对应于最终的包集(或其他一些人称之为固定点计算的结果)并且仅在处理依赖项时使用。Whilesuper是前几个阶段的评估结果,nixpkgs仅在您引用要覆盖或访问某些功能的包时使用。
可悲的是,我真的不明白这一点。nixpkgs覆盖层以什么方式更新,从而有上面提到的 2 个限制?
给出以下代码:
newtype HelloMessage = HelloMessage { msg :: String }
deriving (Generic)
instance ToJSON HelloMessage
type API2 = "hello"
:> QueryParam "age" Int
:> Get '[JSON] HelloMessage
appAPI2 :: Proxy API2
appAPI2 = Proxy
myHandler :: Server API2
myHandler = helloHandler
where
helloHandler :: Maybe Int -> Handler HelloMessage
helloHandler mAge =
let
sAge = case mAge of
Nothing -> "0"
Just ag -> show ag
in
return . HelloMessage $ sAge
app2 :: Application
app2 = serve appAPI2 myHandler …Run Code Online (Sandbox Code Playgroud)