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
Function ';选项<;单位->;单位>;类型和等式';使用F#_Function_F#_Option - Fatal编程技术网

Function ';选项<;单位->;单位>;类型和等式';使用F#

Function ';选项<;单位->;单位>;类型和等式';使用F#,function,f#,option,Function,F#,Option,考虑以下代码: let fnOption = Some (fun () -> ()) fnOption = None 它给出了以下错误: init.fsx(2,1):错误FS0001:type'(unit->unit)'不支持'equality'约束,因为它是函数类型 为什么呢?我忽略了什么吗?不清楚你想做什么。目前,第二行是平等测试,而不是赋值。如果您打算为fnOption指定一个新值,则需要使其可变: let mutable fnOption = Some(fun () ->

考虑以下代码:

let fnOption = Some (fun () -> ())
fnOption = None
它给出了以下错误:

init.fsx(2,1):错误FS0001:type'(unit->unit)'不支持'equality'约束,因为它是函数类型


为什么呢?我忽略了什么吗?

不清楚你想做什么。目前,第二行是平等测试,而不是赋值。如果您打算为
fnOption
指定一个新值,则需要使其可变:

let mutable fnOption = Some(fun () -> ())
fnOption <- None
let mutable fnpoption=Some(fun()->())

fnpoption如果您确实想检查是否相等(而不是分配值),则可以使用
Option.isNone fnpoption
。如果确实要分配,请查看kvb的答案。

功能不可比较,但选项可比较,对吗?我能做到:
让a=4;a=None
他是否可以使用某个id而不是某个(fun()->())?@Alex-不,函数类型的值不可比较,因此包含函数的选项也不可比较(不管实际值是什么)。即使
(None:(unit->unit)option)=None
也不会编译,因为编译器不会“查看”选项值;判断这些值是否可以比较完全是基于它们的类型。这是正确的。我没有注意到这个功能。那么这是否意味着F#试图实现结构平等?但是它可以立即看到一些XXX没有,甚至不需要检查里面有什么。错误发生在编译时,而不是运行时。F#编译器试图编译代码,但失败了,因为
类型“(单位->单位)”不支持“相等”约束。在动态语言上(没有预编译类型检查),它可能与结构相等一起工作。现在我明白了。感谢澄清函数是FP中的第一类值,但它们是特殊类型的值,因为它们用于根据u传递给它们的参数生成其他值,因此比较两个函数没有意义,因此没有为函数定义相等运算符