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

时间:2016-07-16 14:29:16

标签: f#

我应该何时使用“忽略”代替“()”?

我试图写下以下内容:

let log = fun data medium -> ()

然后我收到以下消息:

  

Lint:'有趣_ - > ()'可能会被重构为'忽略'。

所以我将声明更新为以下内容:

let log = fun data medium -> ignore

是否有任何关于我为何使用其中一个的指导?

我的直觉告诉我在执行实际表达式时应该使用ignore。 但在这种情况下,我正在声明一个高阶函数。

我的假设是否准确?

2 个答案:

答案 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 _ _ -> ()可以忽略两个参数,这是一个很好的,可读的方式。