我有一段看起来像这样的Haskell代码:
fst . f $ (Z :. i `div` 2)
Z
和:.
取自Repa库,定义如下:
data Z = Z deriving (Show, Read, Eq, Ord)
infixl 3 :.
data tail :. head = !tail :. !head deriving (Show, Read, Eq, Ord)
$
的表达式右边定义了一个数组索引,而f
是一个获取该索引并返回一对的函数。这将编译为以下核心:
case f_a2pC
(case ># x_s32E 0 of _ {
False ->
case <# x_s32E 0 of _ {
False -> :. Z (I# (quotInt# x_s32E 2));
True -> :. Z (I# (-# (quotInt# (+# x_s32E 1) 2) 1))
};
True ->
case <# x_s32E 0 of _ {
False -> :. Z (I# (quotInt# x_s32E 2));
True -> :. Z (I# (-# (quotInt# (+# x_s32E 1) 2) 1))
}
})
of _ { (x1_a2Cv, _) ->
x1_a2Cv
}
对我而言,似乎很明显(可能不正确)中间案例陈述(># x_s32E 0
作为审查员的陈述)是多余的,因为两个分支都是相同的。我有什么办法可以摆脱它吗?我使用在Repa文档中建议的GHC选项编译我的代码:-O2 -Odph -fno-liberate-case -funfolding-use-threshold1000 -funfolding-keeness-factor1000