Привязка вложенных монад в F#

Пытаюсь обернуть мою мягкую голову монад и привязку

Возьмите этот фрагмент, например, просто как учебное упражнение.

open FSharpPlus
open FSharpPlus.Data

let lowerBounds i = 
    if i > 10 then
               Ok i
               else
                  Error "i was <= 10"

let upperBounds i = 
    if i < 20 then
                Ok i
                    else
                    Error "i was >= 20"
let even i = 
    if i % 2 = 0 then
               Ok i
              else
                  Error "i was uneven"

let rebind validation x = x >>= validation |> Seq.singleton

seq{10..20} |> Seq.map lowerBounds
    >>= rebind upperBounds
    >>= rebind even

Пока это выполняется, мне не нравится rebind функция, поскольку она не является универсальной и привязана к Seq.singleton, не говоря уже о том, что я не вижу, как сделать его свободным от точки (но это мелочь...)

Теперь я знаю, что могу передать зависимости или полностью реорганизовать вещи и составить функции проверки, но я пытаюсь научиться связываться с вложенной монадой. (Что-то вроде рекурсивного>>= инфиксный оператор??), который, кажется, будет более FPish подходом?

Как видите, я использую FSharpPlus, и я взглянул на раздел преобразователя монад, но я не знаю, даже если это то, на что мне следует смотреть?

1 ответ

Решение

Можно использовать состав Клейсли:

seq{10..20} |> Seq.map ( lowerBounds >=> upperBounds >=> even)
Другие вопросы по тегам