【发布时间】:2016-07-14 01:50:57
【问题描述】:
open System
let x = (1, 2)
let (p, q) = x
printfn "A %A" x
printfn "B %A %A" p q
let y = Some(1, 2)
try
let None = y
()
with
| ex -> printfn "C %A" ex
let Some(r, s) = y
printfn "D %A" y
// printfn "E %A %A" r s
当我取消注释最后一行时,编译器会拒绝抱怨的代码
/home/rRiy1O/prog.fs(16,19):错误 FS0039:未定义值或构造函数“r”
/home/rRiy1O/prog.fs(16,21): error FS0039: The value or constructor's' is not defined
在解构let时不允许使用枚举吗?
但首先,即使我注释掉最后一行......我在这里做什么 am?这是输出:
A (1, 2)
B 1 2
D Some (1, 2)
更新
为了记录,这里是固定版本:
open System
let x = (1, 2)
let (p, q) = x
printfn "A %A" x
printfn "B %A %A" p q
let y = Some(1, 2)
try
let (None) = y
()
with
| ex -> printfn "C %A" ex
let (Some(r, s)) = y
printfn "D %A" y
printfn "E %A %A" r s
输出:
A (1, 2)
B 1 2
C MatchFailureException ("/home/MBO542/prog.fs",10,6)
D Some (1, 2)
E 1 2
完美。
【问题讨论】:
-
没有直接关系,但
let None = y行是否创建了一个名为 None 的新值? -
@MarkPattison \(^o^)/
-
在 F# 中,应该避免重新定义
None或Some,但现在看来,您正在以一种艰难的方式学习这一点。同样对于 .NET 和 F#,尤其要避免使用try ... catch,因为它在时间上很昂贵。如果您需要捕获错误/异常,强烈考虑使用Option type 或更高级的场景Railway oriented programming -
你能改一下标题吗,我没有看到枚举。
-
@GuyCoder 傻了我,我更新了标题。有区别的联合在 Rust 中被称为枚举,我花了很多时间。顺便说一句,
try...catch专门用于针对None的非详尽模式匹配,这会产生异常(我在移动设备上,找不到它的确切名称。)我的意图不是重新定义None。您似乎误解了我提出这个问题的意图。
标签: f# pattern-matching variable-declaration let destructuring