次のコードがあります。引数1000000で実行するには1を要しますが、myEvenを標準evenと置き換えた場合、実行には5秒かかります。コードをチェックしたところ、標準でも、の機能は* myEven *とまったく同じです。Haskellの 'even'関数がプログラムを遅くするのはなぜですか?
import Data.Word
import Data.List
import System.Environment
collatzNext :: Word32 -> Word32
collatzNext a = (if myEven a then a else 3*a+1) `div` 2
myEven :: (Integral a) => a -> Bool
myEven a = (a `rem` 2) == 0
collatzLen :: Word32 -> Int
collatzLen a0 = length $ takeWhile (/= 1) $ iterate collatzNext a0
main = do
[a0] <- getArgs
let max_a0 = (read a0)::Word32
print $ maximum $ map (\a0 -> (collatzLen a0, a0)) [1..max_a0]
あなたは[info-page](https://stackoverflow.com/tags/haskell/info)を読んで、オプション '-O2'を使ってプログラムをコンパイルしましたか? – epsilonhalbe
@epsilonhalbe:これは7.10のコンパイラ(よく、ライブラリ)回帰です。しかし、それは8.0で修正されました:https://ghc.haskell.org/trac/ghc/ticket/11701 – Zeta