Предполагая, что забота об эффективности действительно важна и не является преждевременной оптимизацией, вам следует оптимизировать ее для наиболее распространенного случая;Я думаю, что даже в Haskell это означает, что вы хотите, чтобы True,True,True
были наверху.
На самом деле, в данном случае, если x == 10
или x == 20
вам не нужно делатьдругие тесты - вам даже не нужно создавать их;и компилятор не может знать (без оптимизации по профилю), какой путь к коду будет выполняться чаще всего, в то время как у вас должна быть разумная догадка (в общем, вам нужно профилирование, чтобы проверить это).
Так чтовы хотите что-то вроде следующего (не проверено):
case x of
10 -> stuff ()
20 -> stuff ()
_ -> case ((x > -10) && (x < 20),x /= 9,(x `mod` 2) == 0) of
(False,_,_) -> error "Not in range"
(_,False,_) -> error "Must not be 9"
(_,_,False) -> error "Must be even"
_ -> error "Error Message"
Отказ от ответственности: я не проверял, что происходит с этим кодом и с исходным после всех оптимизаций.