使用F#在Suave.IO中构成Web部件的延续

时间:2019-01-04 16:50:11

标签: f# combinators suave

使用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"

作为一名出色的函数程序员,我想将整体分解为不同的组件。最好的方法是什么?

我的第一次尝试使用“连续” 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

我的直觉说这样的事情应该起作用,但是我不了解足够的类别理论来正确地做到这一点。任何见识都将受到欢迎。

1 个答案:

答案 0 :(得分:1)

如果您部分应用firstsecond,它们将变成Webpart -> Webpart

然后您可以使用函数组合:

first 1 >> second 2 <| third