Прежде всего, тип вашего bind
неправильный:
your version : Result<'a> -> (Result<'a> -> Result<'b>) -> Result<'b>
typical type : Result<'a> -> ('a -> Result<'b>) -> Result<'b>
Остальное будет намного проще, если вы измените порядок параметров для получения:
bind : ('a -> Result<'b>) -> Result<'a> -> Result<'b>
Итак, вы можете использовать следующее bind
:
let bind f x =
match x with
| Success x -> f x
| Failure -> Failure
Как только вы это сделаете, вы можете определить bindIsPositive
и bindToString
.Операция bind
теперь принимает функцию в качестве первого аргумента, так что это работает, но вы должны удалить аннотацию вашего типа:
let bindIsPositive = bind isPositive
let bindToString = bind toString
При составлении функций вы можете использовать оператор >>=
,или используйте обычный F # трубопровод и bind
функции:
let strintToIntIsPositiveIntToString x = x |> stringToInt |> bindIsPositive |> bindToString
let strintToIntIsPositiveIntToString x = x >>= stringToInt >>= isPositive >>= toString