Вот это тестовая программа:Помощь GHC распаковывать в Int в равенстве на постоянной
main = do
n <- fmap read $ getLine :: IO Int
if (999999 == n) then putStrLn "equal" else return()
А вот соответствующий бит ядра при компиляции с ghc --make -O2 -ddump-to-file -ddump-simpl -dsuppress-module-prefixes -dsuppress-uniques -ddump-core-stats -ddump-inlinings
:
case readEither6 @ Int (run @ Int main3 ipv1) of _ [Occ=Dead] {
[] -> case error @ Int readEither4 of wild1 { };
: x ds1 ->
case ds1 of _ [Occ=Dead] {
[] ->
case x of _ [Occ=Dead] { I# ipv2 ->
case ipv2 of _ [Occ=Dead] {
__DEFAULT -> (# ipv,() #);
999999 -> hPutStr2 stdout main2 True ipv
}
};
: ipv2 ipv3 -> case error @ Int readEither2 of wild2 { }
}
Я интересно если совпадение по буквам 999999 действительно действительно самое эффективное, и если нет, то как я могу поощрить GHC превратить это в призыв к ==#
или что-то в этом роде?
(Мое фактическое применение более активно)
Упс, я пропустил внешний корпус. Это сделало мой ответ совершенно не относящимся к заданному вопросу. – Carl
@ Карл, я не знаю, является ли это актуальным или нет для намерения вопроса! – dfeuer