Если вы хотите выполнить всю вещь Option.bind ...
только тогда, когда z
равен Some
, вы можете просто использовать для этого еще один Option.bind
- это именно то, для чего bind
предназначен:
let great y maybeZ =
Option.bind (fun z -> Option.bind (cons z >> Some) y) maybeZ
Или, чтобы выразить это более элегантно:
let great maybeY maybeZ =
maybeZ |> Option.bind (fun z ->
maybeY |> Option.bind (cons z >> Some) )
Первая строка будет выглядеть так: "bind MaybeZ с z, и ..."
На самом деле, я бы, наверное,проделайте то же самое с y
только для дополнительной читабельности:
let great maybeY maybeZ =
maybeZ |> Option.bind (fun z ->
maybeY |> Option.bind (fun y ->
Some (z :: y) ) )
В качестве альтернативы вы можете использовать Option.map2
, что делает именно это: применяет функцию к двум option
типизированным параметрам, когда обаSome
:
let great maybeY maybeZ =
Option.map2 (fun y z -> z :: y) maybeY maybeZ
И затем вы можете уменьшить ее (но, к сожалению, только на maybeZ
, из-за ограничения значения):
let great maybeY =
Option.map2 (fun y z -> z :: y) maybeY
Или вывместо этого можно избавиться от лямбды, если вы просто изменили параметры:
let great maybeY maybeZ =
Option.map2 cons maybeZ maybeY