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

标签 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 ...你必须向下滚动一点才能看到定义;寻找 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/

相关文章:

haskell - 在 Haskell 中,是否可以限定导入模块的一部分?

haskell - 在 Haskell 中使用映射时跳过异常

bash - 从 Bash 中的字符串中删除固定前缀/后缀

Haskell GADT 'Show' - 实例类型变量推导

haskell - 最小和最大函数中的类型错误

performance - 这个 Haskell 合并代码的运行时间是多少

r - 使用部分字符串匹配创建指示变量

class - Scala:忽略等于/哈希码的案例类字段?

python - 查找列表中的连续模式

pattern-matching - 使用什么数据结构来实现模式匹配?