F#:解构绑定与可辨别联合
F#: Destructuring bind with a discriminated union
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): error FS0039: The value or constructor 'r' is not defined
/home/rRiy1O/prog.fs(16,21): error FS0039: The value or constructor 's' is not defined
是否不允许在解构中使用枚举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
完美。
你试图解构的方式 y
:
let Some(r, s) = y
您实际上是在定义一个名为 Some
的函数,它带有两个参数 r
和 s
,以元组形式传递。
为了正确解构,您需要添加括号:
let (Some (r, s)) = y
顺便说一句,在 try
块中发生了同样的事情:行 let None = y
创建了一个名为 None
的新值,等于 y
.
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): error FS0039: The value or constructor 'r' is not defined
/home/rRiy1O/prog.fs(16,21): error FS0039: The value or constructor 's' is not defined
是否不允许在解构中使用枚举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
完美。
你试图解构的方式 y
:
let Some(r, s) = y
您实际上是在定义一个名为 Some
的函数,它带有两个参数 r
和 s
,以元组形式传递。
为了正确解构,您需要添加括号:
let (Some (r, s)) = y
顺便说一句,在 try
块中发生了同样的事情:行 let None = y
创建了一个名为 None
的新值,等于 y
.