我应该何时使用“忽略”代替“()”?
我试图写下以下内容:
let log = fun data medium -> ()
然后我收到以下消息:
Lint:'有趣_ - > ()'可能会被重构为'忽略'。
所以我将声明更新为以下内容:
let log = fun data medium -> ignore
是否有任何关于我为何使用其中一个的指导?
我的直觉告诉我在执行实际表达式时应该使用ignore。 但在这种情况下,我正在声明一个高阶函数。
我的假设是否准确?
答案 0 :(得分:6)
你在这里得到的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只是寻找简单的模式,忽略了有时重构不是全部的事实是有用的。
答案 1 :(得分:3)
从不,至少不是问题中显示的方式。
在ignore
和()
之间替换是没有意义的,因为它们是不同的概念:
ignore
是一个带有一个参数和单位返回的泛型函数。其类型为'T -> unit
。()
是类型unit
的唯一有效值。它根本不是一种功能。因此,执行问题中显示的重构无效。 log
的第一个版本需要两个参数,而第二个版本需要三个。
Lint试图表明的并不是很清楚。 ignore
是一个带有一个参数的函数;它应该如何(或为什么)用来重构一个带有两个curried参数的方法并不明显。 fun _ _ -> ()
可以忽略两个参数,这是一个很好的,可读的方式。