F#:解构与受歧视的联合绑定

时间:2016-03-26 11:18:35

标签: f# pattern-matching variable-declaration let destructuring

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

完美。

1 个答案:

答案 0 :(得分:9)

您尝试构建y的方式:

let Some(r, s) = y

您实际上是在定义一个名为Some的函数,其中有两个参数rs,以tupled形式传递。

要进行正确的解构,您需要添加括号:

let (Some (r, s)) = y

顺便说一句,同样的事情发生在try块内:行let None = y创建一个名为None且等于y的新值。