Ho un pezzo di codice Haskell che assomiglia a questo:Rimozione "caso" con rami duplicati dal Centro della Haskell
fst . f $ (Z :. i `div` 2)
Z
e :.
sono tratte da Repa biblioteca e sono definiti in questo modo:
data Z = Z deriving (Show, Read, Eq, Ord)
infixl 3 :.
data tail :. head = !tail :. !head deriving (Show, Read, Eq, Ord)
L'espressione destra di $
definisce un indice di matrice, mentre f
è una funzione che prende quell'indice e restituisce una coppia. Questo compila in seguito Nucleo:
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
}
A me sembra ovvio (forse erroneamente) che il caso affermazione centrale (quello con ># x_s32E 0
come scrutinee) è ridondante, in quanto entrambi i rami sono identici. C'è qualcosa che posso fare per liberarmene? Compilo il mio codice utilizzando le opzioni GHC consigliato nella documentazione Repa: -O2 -Odph -fno-liberare-caso -funfolding-uso-threshold1000 -funfolding-keeness-factor1000
A meno che 'i' possa essere legittimamente negativo, si dovrebbe usare' quot' invece di 'div'. Questo dovrebbe risolverlo. –
Hai ragione - questo risolve il mio problema. Puoi postare quel commento come risposta in modo che io possa accettarlo? –