Привязка вложенных монад в 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)