Создание продолжений веб-части в Suave.IO с помощью F # - PullRequest
0 голосов
/ 04 января 2019

Используя Suave.IO, у меня есть следующая монолитная веб-часть:

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"

Будучи хорошим функциональным программистом, я бы хотел разбить монолит на отдельные компоненты. Каков наилучший способ сделать это?

В моей первой попытке используются веб-части "продолжения", например:

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 голосов
/ 05 января 2019

Если вы частично примените first и second, они станут Webpart -> Webpart.

Затем вы можете использовать функцию композиции:

first 1 >> second 2 <| third
...