如果函数的某个情况会导致按原样返回输入,那么针对该情况使用无点 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 中,可能存在差异。哪个更好取决于具体情况。具体来说,只有“完全应用”函数时,优化器才会内联该函数。所以在第一个公式中,如果你要做类似的事情
fooThing (myFunc 0)
然后(除非首先发生一些其他优化),GHC 将生成一个表示 myFunc 0
的闭包,然后在 fooThing
决定这样做时应用它。如果您使用基于 id
的实现,GHC 会将上述内容转换为
fooThing id
关于haskell - 使用无点身份函数而不是通配符有优势吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28015570/