作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
人们经常想要通过一组异构对象(不同类型)进行迭代(使用 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/
我是一名优秀的程序员,十分优秀!