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# - Fatal编程技术网

F# 如何使用“重构函数”;“忽略”;

F# 如何使用“重构函数”;“忽略”;,f#,F#,什么时候应该使用“忽略”而不是“()”? 我试图写以下内容: let log = fun data medium -> () let log = fun data medium -> ignore 然后我收到了以下信息: Lint:“fun()”可能可以重构为“ignore” 因此,我将声明更新为以下内容: let log = fun data medium -> () let log = fun data medium -> ignore 关于为什么我可能会使用

什么时候应该使用“忽略”而不是“()”?

我试图写以下内容:

let log = fun data medium -> ()
let log = fun data medium -> ignore
然后我收到了以下信息:

Lint:“fun()”可能可以重构为“ignore”

因此,我将声明更新为以下内容:

let log = fun data medium -> ()
let log = fun data medium -> ignore
关于为什么我可能会使用一个而不是另一个,有什么指导吗?

我的直觉告诉我在执行实际表达式时应该使用ignore。 在本例中,我声明了一个高阶函数


我的假设准确吗?

永远不会,至少不会以问题中所示的方式

忽略
()
之间进行替换没有意义,因为它们是不同的概念:

  • ignore
    是一个通用函数,具有一个参数和单位返回。它的类型是
    'T->unit
  • ()
    是类型
    单元的唯一有效值。它根本不是一个函数
因此,执行问题中所示的重构是无效的。
log
的第一个版本采用两个curried参数,而第二个版本采用三个curried参数


林特试图暗示的内容并不十分清楚
ignore
是一个具有一个参数的函数;不清楚如何(或为什么)使用它来重构一个包含两个curry参数的方法
fun(
是一种可以忽略两个参数且可读性很好的方式。

您在这里得到的linter消息有点混乱。
ignore
函数只是一个接受任何内容并返回单位的函数:

let ignore = fun x -> ()
您的
log
函数有点类似于
ignore
,但它需要两个参数:

let log = fun data medium -> ()
在F#中,这实际上是一个返回另一个函数(currying)的函数。你可以更明确地说:

let log = fun data -> fun medium -> ()
现在,您可以看到函数的一部分实际上与
ignore
相同。你可以写:

let log = fun data -> ignore

这意味着与原始函数相同的事情,这就是linter所建议的。我不会以这种方式编写代码,因为代码的作用不太明显(它实际上需要两个参数)-我猜linter只是在寻找简单的模式,忽略了这样一个事实,即有时重构并不是那么有用。

let log=fun data media->()
返回单元,虽然
let log=fun data media->ignore
返回一个返回单元的函数,但一个函数不会替换另一个函数。lint消息表示前者在语义上与
ignore
相同,而不是二进制而不是一元。正如经常提到的,如果您使用
ignore
或获取编译消息以使用
ignore
,您应该真正查看代码并理解原因,通常,这是一个设计问题,而不是应该以何种方式进行。正如我经常注意到的,我很少需要忽略,它几乎总是与用户I/O(例如)或与非功能性代码(例如.NET方法)交互,例如,在我的情况下,我的日志函数旨在通过I/O与外部世界交互。我想,这是林特的错。它应该建议将
funx->()
替换为
ignore
。注意,它建议您替换整个函数,而您只更改了它的主体,这不是Lint所要求的。在任何情况下,您的
日志
有两个参数,不应该建议将其替换为
忽略
。我认为问题得到了-1,因为标题所建议的是两个概念的混合,但我认为在给出linter消息的情况下,提出这个问题是完全正确的。我把标题改成了我认为更合适、不会让人困惑的东西。