Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#:使用判别并集分解绑定_F#_Pattern Matching_Variable Declaration_Let_Destructuring - Fatal编程技术网

F#:使用判别并集分解绑定

F#:使用判别并集分解绑定,f#,pattern-matching,variable-declaration,let,destructuring,F#,Pattern Matching,Variable Declaration,Let,Destructuring,当我取消注释最后一行时,编译器会拒绝代码 /home/rRiy1O/prog.fs(16,19):错误FS0039:未定义值或构造函数“r” /home/rRiy1O/prog.fs(16,21):错误FS0039:未定义值或构造函数 是否不允许在分解结构时使用枚举let 但首先,即使我把最后一行注释掉。。。我在这里干什么?以下是输出: open System let x = (1, 2) let (p, q) = x printfn "A %A" x printfn "B %A %A" p

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

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

是否不允许在分解结构时使用枚举
let

但首先,即使我把最后一行注释掉。。。我在这里干什么?以下是输出:

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
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

完美。

你试图解构的方式
y

A (1, 2)
B 1 2
C MatchFailureException ("/home/MBO542/prog.fs",10,6)
D Some (1, 2)
E 1 2
实际上,您正在定义一个名为
Some
的函数,该函数有两个参数,
r
s
,以元组形式传递

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

let Some(r, s) = y

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

没有直接关系,但是
let None=y
行是否创建了一个名为None的新值?@MarkPattison(^o^)/在F#中,人们应该避免重新定义
None
Some
,但现在看来,你正在艰难地学习这一点。另外,对于.NET和F#尤其要避免使用
try。。。捕获
,因为它在时间上很昂贵。如果您需要捕获错误/异常,请强烈考虑使用OR或更高级的方案,您可以更改标题,我没有看到枚举。@ GuyCudio愚蠢的我,我更新了标题。歧视工会被称为“铁锈中的枚举”,我花了很多时间在这上面。顺便说一句,
try…catch
是专门针对
None
的非穷举模式匹配,这会产生一个异常(我在手机上,找不到它的确切名称)。我的意图不是重新定义
None
。您似乎误解了我在这个问题背后的意图。
选项
enum的两个案例都编译得很好,但都违背了我的意图,这一事实让我感到非常难受。顺便问一下,你是如何获得这些知识的?根据经验,或者在语言参考中有没有我遗漏的描述?当然,经验是王道。没有什么比实际使用它更能让人理解事情了。向他人解释也有助于提高自己的理解力,这就是为什么我在这里:-)。除此之外,我总是推荐优秀的资源,它充满了各种各样的优秀解释。使用VS(或者可能是其他IDE)可以很容易地看到正在发生的事情,通过将鼠标悬停在事物上查看它们的隐含类型。或者交互窗口会立即报告类型。@MarkPattison True,如果我在家里的Linux PC上有VS:-)在Linux上,请尝试Visual Studio代码+Ionide插件for F#
let (Some (r, s)) = y