使用无点身份函数而不是通配符有优势吗?

Is there an advantage to using a point-free identity function instead of a wildcard?

如果一个函数有一个情况会导致按原样返回输入,那么对于这种情况使用无点 id 有什么好处吗?

示例:

-- First way, use some symbol as wildcard
myFunc :: Int -> SomeData -> SomeData
myFunc 0 _ = _
myFunc ...

-- Second way, point-free `id`. Is this more efficient?
myFunc :: Int -> SomeData -> SomeData
myFunc 0 = id
myFunc ...

我认为可以使用的一个标准函数是 drop,因为 drop 0 实际上是 id。但是,如果您查看 source code,则它不是无意义的(有 drop 0 xs = xs ......您必须向下滚动一点才能看到定义;寻找 drop (I# n#) ls)。我怀疑如果 drop 不使用它也没什么大不了的。

编辑:实际上 it looks like equations with differing numbers of arguments is disallowed 通过大小写扩展法翻译多方程函数定义。

因此,如果您选择这条路线,则必须确保该函数的所有剩余方程式也可以相同的无点样式定义——这对于大多数函数来说是极不可能的。

在 GHC 中,可能会有所不同。哪个更好,要视情况而定。具体来说,只有 "fully applied" 的函数才会被优化器内联。所以在第一个公式中,如果你要做类似

fooThing (myFunc 0)

然后(除非先进行一些其他优化),GHC 将生成一个表示 myFunc 0 的闭包,然后在 fooThing 决定这样做时应用它。如果您改用基于 id 的实现,GHC 会将上述内容转换为

fooThing id