如果一个函数的情况会导致输入按原样返回,那么在这种情况下使用无点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
。但是如果你看源代码,它不是免费的(有drop 0 xs = xs
.您必须向下滚动一点才能看到定义;查找drop (I# n#) ls
)。我怀疑如果drop
不使用它,这不会有多大关系。
编辑:实际上它看起来不允许有不同数目的参数的方程。通过案例扩展的方法来翻译多方程函数定义.
所以,如果你选择了这条路线,你必须确保函数的所有剩余方程也可以用相同的无点风格定义--这对于大多数函数来说是非常不可能的。
发布于 2015-01-18 14:45:26
在GHC中,可能有不同之处。哪个更好将取决于情况。具体来说,一个函数只有在“完全应用”时才会被优化器内联。所以在第一个公式中,如果你要做一些类似的事情
fooThing (myFunc 0)
然后(除非首先进行其他优化),GHC将生成一个表示myFunc 0
的闭包,然后在fooThing
决定这样做时应用它。如果您使用的是id
-based实现,GHC将将上述转换为
fooThing id
https://stackoverflow.com/questions/28015570
复制相似问题