gpt4 book ai didi

f# - 为什么我不能通过一个受歧视工会的成员列表来简化这个迭代?

转载 作者:行者123 更新时间:2023-12-04 23:38:43 25 4
gpt4 key购买 nike

人们经常想要通过一组异构对象(不同类型)进行迭代(使用 map、iter 或 fold)。解决这个问题的一种方法是创建一个有区别的联合,它允许创建一个列表,其中包含适当转换为 DU 案例的对象。以下代码在一个简单的示例中执行此操作:

type MYDU = | X1 of int
| X2 of float
| X3 of string

let bar (y: MYDU) =
match y with
| X1 x -> printfn "%A" x
| X2 x -> printfn "%A" x
| X3 x -> printfn "%A" x

[X1(1); X2(2.0); X3("3"); X1(4)]
|> List.map bar |> ignore

此代码运行良好并打印
1
2.0
"3"
4

伟大的!但我想知道是否可以避免重复调用 printfn .我尝试了以下方法,但无法编译:
let baz (y: MYDU) =
match y with
| X1 x | X2 x | X3 x -> printfn "%A" x // red squiggly line under X1 x

编译器发出此消息:
This expression was expected to have type 'int' but here has type 'float'
我怀疑避免重复是可行的,但我一定犯了一个基本错误。有什么建议么?

最佳答案

你没有犯错,这不是 F# 的类型系统允许的。

您可以在匹配案例箭头的左侧有多个模式,但它们需要绑定(bind)相同的值集(包括类型)。在这里,x每种模式都有不同的类型,这足以让编译器提示。

有一些方法可以减轻痛苦(你可以在 DU 上有一个成员返回一个装箱值,或者你可以有一个事件模式来在匹配情况下进行装箱),但它们是高度情境化的。将模式拆分为单独的案例并为每个案例重复右侧总是在真空中更好的解决方案。

关于f# - 为什么我不能通过一个受歧视工会的成员列表来简化这个迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46141157/

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