競速 Reprise
承接兩年前的 C/C++/Java/Ruby 大亂鬥,這次我寫了 Haskell 版本:
1: import Control.Monad.State 2: 3: cycleLength 1 k = k 4: cycleLength n k | even n = cycleLength (n `div` 2) $! (k + 1) 5: | otherwise = cycleLength (3 * n + 1) $! (k + 1) 6: 7: driver :: State [Int] (IO ()) 8: driver = do eof <- gets null 9: if eof then return (return ()) 10: else do this <- commit 11: remains <- driver 12: return (this >> remains) 13: 14: commit :: State [Int] (IO ()) 15: commit = do i <- nextInt 16: j <- nextInt 17: return $ print 18: (maximum . map (flip cycleLength 1) $ [min i j .. max i j]) 19: where nextInt = State $ \(x : xs) -> (x, xs) 20: 21: main = getContents >>= evalState driver . map read . words用 ghc 編譯並開
-O
最佳化,執行時間大約是 1.1 秒,是 C++ 版本的 5 倍多。其實還勉強可以接受啦 XD。(偏心?XD)至於程式碼我覺得有一點點彆扭,總覺得 IO monad 和 State monad 沒有搭配得很好。
--
現在在讀 Real World Haskell 的線上 beta 版!
Labels: Haskell
看的出來有偏心...XD
看到這篇我突然想起一件事…
"Fundamental C++"
我應該沒記錯書名吧 XD
現在可以正式回應了:因為後來譯了《C++ Primer》4/e,覺得我想達成的目標都已經被它達成了,所以就不用重造輪子啦 XD。
<< 回到主頁