gpt4 book ai didi

F# 和否定匹配

转载 作者:行者123 更新时间:2023-12-05 00:57:27 24 4
gpt4 key购买 nike

我有一个被歧视的类型:

type Item =
| Normal of string * float32
| Special1 of Item
| Special2 of Item

我有一个使用这种类型的函数:

let rec calcItem (i: Item ) =
match i with
| Normal(_, p) -> p
| Special1(g) | Special2(g) -> (calcItem g) + 1

在我的例子中,Special_n 类型将以相同的形式定义。所以我想知道是否可以使用通配符模式来匹配所有这些类型。 _ 匹配不起作用,因为它不接受参数。

最佳答案

类似于this onethis one .

正如那里所解释的,您可以使用反射或重新设计您的 DU(这是我推荐的)。

反射(reflection):

open Microsoft.FSharp.Reflection

type Item =
| Normal of string * float32
| Special1 of Item
| Special2 of Item

let innerValue a =
FSharpValue.GetUnionFields (a, a.GetType())
|> snd
|> Seq.head
:?> Item

let rec calcItem (i: Item ) =
match i with
| Normal (_, p) -> p
| specialN -> calcItem (innerValue specialN) + 1.0f

重新设计 DU:

type Item =
| Normal of string * float32
| Special of int * Item

let rec calcItem (i: Item ) =
match i with
| Normal (_, p) -> p
| Special (_, g) -> calcItem g + 1.0f

关于F# 和否定匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24137032/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com