【问题标题】:Concise pattern match on single case discriminated union in F#F# 中单一大小写区分联合的简明模式匹配
【发布时间】:2012-08-27 06:22:42
【问题描述】:

假设我有以下单例区分联合:

type OrderId = OrderId of string

有时我需要实际的字符串。我发现提取它的方法是:

let id = match orderId with OrderId x -> x

有更简洁的方法吗?

我知道我的使用是一种特殊情况,匹配是有意义的,以确保您已经涵盖了可能性,只是想知道是否有一种方法可以做类似的事情:

let OrderId id = orderId

【问题讨论】:

    标签: f# pattern-matching discriminated-union


    【解决方案1】:

    你快到了。括号是必需的,以便编译器将 let-bound 解释为模式匹配:

    let (OrderId id) = orderId
    

    如果orderId是函数的参数,你也可以直接在那里使用模式匹配:

    let extractId (OrderId id) = id
    

    【讨论】:

      【解决方案2】:

      当您使用可区分联合来保存单个值(这是一种有用的 F# 编程技术)时,使用用于访问该值的属性来定义它可能是有意义的:

      type OrderId = 
        | OrderId of string 
        member x.Value = let (OrderId v) = x in v
      

      Value 的实现是使用 pad 发布的使用 let 的模式匹配。现在,如果你有一个类型为OrderId 的值orderId,你可以写:

      let id = orderId.Value
      

      然而,使用(OrderId id) 的模式匹配仍然非常有用,因为只有当编译器已经知道orderId 的类型时,属性访问才会起作用(因此您通常会在函数参数中使用模式匹配,但属性访问其他值)。

      【讨论】:

      • 不幸的是,你失去了类型推断,需要你经常指定类型,这会导致更多的冗长。我个人更喜欢 getlift 这样的模块方法,它不会有这个问题,并且通常允许管道、合成和更无点的样式(尽管这在许多场景中也是一种有用的方法)跨度>
      猜你喜欢
      • 2018-02-03
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      • 2019-06-06
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      • 2016-07-02
      相关资源
      最近更新 更多