【问题标题】:haskell - will pattern matching work faster for non-specific form of an algebraic data type?haskell - 对于非特定形式的代数数据类型,模式匹配会更快吗?
【发布时间】:2013-08-12 23:23:34
【问题描述】:

我有以下类型:

data Tree a =   Empty |
                Branch {    key     :: a,
                            balance :: Int8,
                            left    :: Tree a,
                            right   :: Tree a,
                            up      :: Bool    --used internally to stop updating balance
                       }
                deriving (Eq)

和一个符合以下模式的函数:

roll (Branch y (-2) l (Branch ry 1 (Branch rly 0 Empty Empty _) rr _) _) = ...

尽管(Branch rly 0 Empty Empty _) 内的Empty Empty 是唯一可能的情况,但我想知道 - 将把表格概括为:

roll (Branch y 2 (Branch ly (-1) ll (Branch lry 0 lrl lrr _) _) r _) = ...

工作速度更快(甚至可以忽略不计),因为运行时不需要将 lrllrrEmpty 匹配?

【问题讨论】:

  • 其他人已经说过“是的,它可能;基准测试只是知道的方法”。然而,在更深入的情况下,它不必评估这些 thunk 来查看它们是否为 Empty,这可能会节省大量计算,从而大大加快速度。这种情况似乎不太可能,但每次匹配模式时它可能会节省一些周期,这取决于用例可能加起来很多

标签: haskell optimization recursion pattern-matching algebraic-data-types


【解决方案1】:

是的,它会更快。如果它值得,只有基准测试才能告诉我们。

【讨论】:

    【解决方案2】:

    可能会产生非常小的速度提升 - 您必须正确地对其进行基准测试才能确定。 (如果您不打算查看lrllrr,不妨改用_。)

    我个人的建议是将明确的Empty 模式保留在那里。您“没有其他可能性”,但在代码中记录这一点会非常有帮助,以防万一您实际上弄错了。 ;-)

    (它也可能会影响您程序的整体严格性/懒惰性 - 但这是一个完整的其他讨论......)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-08
      • 2015-04-07
      相关资源
      最近更新 更多