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):错误FS0039:值或构造函数' s'未定义
是否不允许在解构let
中使用枚举?
但首先,即使我在最后一行发表评论......我在这做什么我?这是输出:
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
完美。
答案 0 :(得分:9)
您尝试构建y
的方式:
let Some(r, s) = y
您实际上是在定义一个名为Some
的函数,其中有两个参数r
和s
,以tupled形式传递。
要进行正确的解构,您需要添加括号:
let (Some (r, s)) = y
顺便说一句,同样的事情发生在try
块内:行let None = y
创建一个名为None
且等于y
的新值。