【发布时间】:2014-07-22 13:42:41
【问题描述】:
我想知道我必须在多大程度上担心在 Haskell(使用 GHC)中对常见子表达式进行微优化,尤其是在数据解构方面。
例如,考虑以下用于合并两个有序列表的代码:
merge :: Ord a => [a] -> [a] -> [a]
merge [] bs = bs
merge as [] = as
merge (a:as) (b:bs) =
case compare a b of
LT -> a : merge as (b:bs) -- (1)
EQ -> a : merge as bs
GT -> b : merge (a:as) bs -- (2)
GHC 会识别 (2) 处的 (a:as) 和 (1) 处的 (b:bs) 与输入参数相同吗?或者,我应该使用“as”模式,例如:
merge a'@(a:as) b'@(b:bs) =
...
LT -> a : merge as b'
...
GT -> b : merge a' bs
一般来说,GHC 什么时候可以识别数据构造中的常见子表达式,我什么时候需要帮助它?
【问题讨论】:
-
我一直在使用它们。这清楚地表明您只是按原样使用输入。
标签: haskell pattern-matching ghc