使用 F# 在 Suave.IO 中组合 Web 部件延续
Composing web part continuations in Suave.IO with F#
使用 Suave.IO,我有以下单体 WebPart:
let success msg =
Successful.OK <| sprintf "Success: %s" msg
let error msg =
Successful.OK <| sprintf "Error: %s" msg
let monolith arg1 arg2 =
if doFirstThing arg1 then
if doSecondThing arg2 then
success "Everything worked"
else
error "Second thing failed"
else
error "First thing failed"
作为一名优秀的函数式程序员,我想将整体分解成不同的组件。最好的方法是什么?
我的第一次尝试使用 "continuation" web 部件,如下所示:
let first arg cont =
if doFirstThing arg then cont
else error "First thing failed"
let second arg cont =
if doSecondThing arg then cont
else error "Secong thing failed"
let third : WebPart =
success "Everything worked"
但是,由于嵌套调用,将它们组合在一起看起来很难看:
first 1 (second 2 third)
有更好的方法吗?具体来说,我可以在每个组件之间插入一个运算符以便优雅地组合它们吗?类似于:
first 1 >?> second 2 >?> third
我的直觉告诉我这样的事情应该行得通,但我对范畴论的了解还不足以正确地做到这一点。欢迎任何见解。
如果您部分应用 first
和 second
,它们将变为 Webpart -> Webpart
。
然后您可以使用函数组合:
first 1 >> second 2 <| third
使用 Suave.IO,我有以下单体 WebPart:
let success msg =
Successful.OK <| sprintf "Success: %s" msg
let error msg =
Successful.OK <| sprintf "Error: %s" msg
let monolith arg1 arg2 =
if doFirstThing arg1 then
if doSecondThing arg2 then
success "Everything worked"
else
error "Second thing failed"
else
error "First thing failed"
作为一名优秀的函数式程序员,我想将整体分解成不同的组件。最好的方法是什么?
我的第一次尝试使用 "continuation" web 部件,如下所示:
let first arg cont =
if doFirstThing arg then cont
else error "First thing failed"
let second arg cont =
if doSecondThing arg then cont
else error "Secong thing failed"
let third : WebPart =
success "Everything worked"
但是,由于嵌套调用,将它们组合在一起看起来很难看:
first 1 (second 2 third)
有更好的方法吗?具体来说,我可以在每个组件之间插入一个运算符以便优雅地组合它们吗?类似于:
first 1 >?> second 2 >?> third
我的直觉告诉我这样的事情应该行得通,但我对范畴论的了解还不足以正确地做到这一点。欢迎任何见解。
如果您部分应用 first
和 second
,它们将变为 Webpart -> Webpart
。
然后您可以使用函数组合:
first 1 >> second 2 <| third