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
When I uncomment the last line, the compiler rejects the code complaining
/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
Is it not allowed to use enumerations in destructuring let
?
But first, even when I comment out the last line... what am I doing here? Here's the output:
A (1, 2)
B 1 2
D Some (1, 2)
For the record, here's the fixed version:
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
Output:
A (1, 2)
B 1 2
C MatchFailureException ("/home/MBO542/prog.fs",10,6)
D Some (1, 2)
E 1 2
Perfect.
The way you attempt to destructure y
:
let Some(r, s) = y
You are actually defining a function named Some
, with two arguments, r
and s
, passed in tupled form.
For correct destructuring, you need to add parentheses:
let (Some (r, s)) = y
Incidentally, same thing happens inside the try
block: the line let None = y
creates a new value named None
and equal to y
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With