Используя 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
Моя интуиция говорит, что что-то вроде этого должно работать, но я не знаю достаточно теории категорий, чтобы сделать это правильно. Любое понимание будет приветствоваться.