haskell - 对于非特定形式的代数数据类型,模式匹配工作会更快吗?

时间:2013-08-11 15:39:17

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

我有以下类型:

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 _) _) = ...

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

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

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

2 个答案:

答案 0 :(得分:2)

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

我个人的建议是在那里留下明确的Empty模式。你“没有其他可能性”,但在代码中记录这一点对于你实际上是错误的不太可能的事件变得非常有帮助。 ; - )

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

答案 1 :(得分:0)

是的,它会更快。如果它值得,只有基准测试可以说明。