f# - 如何命名中缀运算符?
问题描述
我有以下代码:
[<AutoOpen>]
module OptionOperators =
let private mapOption func arg =
match arg with
| None -> Ok None
| Some arg -> func arg |> Result.map Some
let ( ^> ) arg func =
mapOption func arg
[<AutoOpen>]
module Model =
// Constrained to be no more than 35 chars, not null or empty, used for tag
type String35 = private String35 of string
module String35 =
let create field str =
ConstrainedType.createString field String35 35 str
type UnvalidatedAddress = { Name: string option }
type Address = { Name: String35 option }
let validate dto =
result {
let! name = dto.Name ^> String35.create "Name"
}
Result 和 Option 的组合是^>
合理的中缀运算符吗?是否有中缀运算符列表?
解决方案
使用那个晦涩的运算符会失去可读性。我建议您寻找任何阅读您的代码的人都能理解的更有意义的东西:
let private validateField validator arg =
match arg with
| None -> Ok None
| Some arg -> validator arg |> Result.map Some
您可以将其用作:
let validate dto =
result {
let! name = dto.Name
|>validateField (String35.create "Name")
}