首页 > 解决方案 > 如何命名中缀运算符?

问题描述

我有以下代码:

[<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 的组合是^>合理的中缀运算符吗?是否有中缀运算符列表?

标签: f#

解决方案


使用那个晦涩的运算符会失去可读性。我建议您寻找任何阅读您的代码的人都能理解的更有意义的东西:

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")
    }

推荐阅读