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

时间:2015-01-18 22:30:04

标签: haskell pattern-matching

如果一个函数有一个案例会导致按原样返回输入,那么在这种情况下使用无点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 ...你需要向下滚动一下才能看到定义;找{4}}。我怀疑如果drop (I# n#) ls没有使用它可能无关紧要。

编辑:实际上it looks like equations with differing numbers of arguments is disallowed用于翻译多方程函数定义的case-expansion方法。

因此,如果你选择了这条路线,你必须确保该函数的所有剩余方程式也可以在相同的无点样式中定义 - 这对大多数函数来说都是不太可能的。

1 个答案:

答案 0 :(得分:4)

在GHC中,可能会有所不同。哪个更好将取决于具体情况。具体而言,如果“完全应用”,则仅由优化程序内联函数。所以在第一个表述中,如果你要做类似的事情

fooThing (myFunc 0)

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

fooThing id