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)
完善.
你试图破坏的方式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.
| 归档时间: |
|
| 查看次数: |
800 次 |
| 最近记录: |