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

nod*_*kai 8 f# pattern-matching destructuring let variable-declaration

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
Run Code Online (Sandbox Code Playgroud)

当我取消注释最后一行时,编译器拒绝代码抱怨

/home/rRiy1O/prog.fs(16,19):错误FS0039:值或构造函数'r'未定义
/home/rRiy1O/prog.fs(16,21):错误FS0039:值或构造函数的' 没有定义

是不允许在解构中使用枚举let?

但首先,甚至当我注释掉最后一行...什么我在这里干什么?这是输出:

A (1, 2)
B 1 2
D Some (1, 2)
Run Code Online (Sandbox Code Playgroud)

更新

为了记录,这是固定版本:

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
Run Code Online (Sandbox Code Playgroud)

输出:

A (1, 2)
B 1 2
C MatchFailureException ("/home/MBO542/prog.fs",10,6)
D Some (1, 2)
E 1 2
Run Code Online (Sandbox Code Playgroud)

完善.

Fyo*_*kin 9

你试图破坏的方式y:

let Some(r, s) = y
Run Code Online (Sandbox Code Playgroud)

实际上,您实际上是Some使用两个参数定义一个名为的函数,r并s以tupled形式传递.

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

let (Some (r, s)) = y
Run Code Online (Sandbox Code Playgroud)

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

  • 当然,经验是国王.没有什么能让人理解像实际做某事的事情.向他人解释也有助于提高你自己的理解,这就是我在这里的原因:-).除此之外,我总是推荐优秀的资源http://fsharpforfunandprofit.com,它充满了各种各样的重要解释. (3认同)
  • 在Linux上,为F#尝试Visual Studio Code + Ionide插件 (3认同)