在模式匹配F#中使用类型测试内联解构

编码埃德加

有没有一种方法可以内联使用类型测试模式记录模式

我可以毫无问题地制作记录模式:

let getName3 (a:A) =
  match a with
  | { name = name } -> name

这是一个完全有效的代码:

type IA =
  abstract ID: string

type A =
  { id: string
    name: string }
  interface IA with
    member this.ID = this.id

let getName (a: IA) =
  match a with
  | :? A as a -> a.name
  | _ -> ""

getName
  { id = "1234"
    name = "andrew" }

// val getName : a:IA -> string
// val it : string = "andrew"

这就是我在说的:

let getName2 (a: IA) =
  match a with
  | :? A ({name = name}) as a -> name // Type Test Pattern with Record Pattern inline, maybe even still use binding (as a)
  | _ -> ""

更新资料

我之前的示例太简单了,请改用以下示例:

type IA =
  abstract ID: string

type Stage =
  | FirstStep
  | SecondStep
  
type A =
  { id: string
    name: string option
    stage: Stage
  }
  interface IA with
    member this.ID = this.id

// This is a "nested" pattern inline, I match two Option with one match 
let tryGetName (a: A option) =
  match a with
  | Some { name = (Some name) } -> Some name
  | _ -> None

// This is a more involved nested pattern inline
let tryGetStageAndName (a: A option) =
  match a with
  | Some { name = (Some name); stage = stage } -> Some (stage, name)
  | _ -> None

// This is the syntax I'm looking for:
let tryGetStageAndName2 (a: IA option) =
  match a with
// notice Some (:? A as a) -> is perfectly valid
  | Some (:? A ({ name = (Some name); stage = stage }) -> Some (stage, name)
  | _ -> None

我还想澄清一下,我的问题是关于F#语法的,不是临时场景或围绕特定框的拳击type A,因为我们可以做嵌套的内联模式,有没有办法在类型测试模式之后做模式?

编码埃德加

当前是fslang-uggestions中的建议:

https://github.com/fsharp/fslang-suggestions/issues/830

该语法尚不存在

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在F#中使用类型测试模式匹配异常?

来自分类Dev

模式匹配(F#)中的部分解构

来自分类Dev

F#返回类型的递归模式匹配

来自分类Dev

F#使用内联:仍然无法为通用函数匹配其他类型

来自分类Dev

C#代码中的模式匹配F#类型

来自分类Dev

F#的衍生类型上的模式匹配是惯用的吗?

来自分类Dev

在C#中使用F#类型

来自分类Dev

F#可选模式匹配

来自分类Dev

F#模式与参数匹配

来自分类Dev

F#模式匹配奇数

来自分类Dev

F#可选模式匹配

来自分类Dev

如何在匹配类型列表中使用模式匹配结果?

来自分类Dev

在 F# 中使用条件参数进行基于属性的测试

来自分类Dev

Scala:在模式匹配中使用超类型运算符

来自分类Dev

是否可以在F#中使用局部类型

来自分类Dev

f#先前模式匹配防护中的窄区分联合(基于控制流的类型分析)

来自分类Dev

具有类型约束的泛型类上的F#模式匹配

来自分类Dev

F#中数据库记录的记录模式和类型不匹配

来自分类Dev

顺序长度上的F#模式匹配

来自分类Dev

模式匹配中的F#惯用转换?

来自分类Dev

简化嵌套模式匹配F#

来自分类Dev

F#中记录上的模式匹配

来自分类Dev

F#模式匹配和功能

来自分类Dev

模式匹配F#中的功能

来自分类Dev

f#模式匹配相反的值

来自分类Dev

F#模式与可选的元组列表匹配

来自分类Dev

f#模式匹配顺序:?seq <_>(IEnumerable)

来自分类Dev

F#模式与字符串匹配

来自分类Dev

F#模式与字符串匹配