I am relatively new to Haskell and I am trying to learn how different actions can be executed in sequence using the do notation. In particular, I am writing a program to ben
Answer originally given by user ysdx on programmers:
Indeed you version will not benchmark your algorithm. As
r
is not used it will not be evaluated at all.You should be able to do it with DeepSeq:
benchmark :: [String] -> IO Integer benchmark inputList = do start <- getCPUTime let r = foo inputList end <- r `deepseq` getCPUTime return (end - start)
(
a `deepseq` b
) is some "magic" expression which forces the complete/recursive evaluation ofa
before returningb
.
I would use the language extension -XBangPatterns, I find that quite expressive in such situations. So you would have to say "let !r = foo inputList
" as in:
{-# LANGUAGE BangPatterns #-}
import System.CPUTime
benchmark :: [String] -> IO Integer
benchmark inputList = do
start <- getCPUTime
let !r = foo inputList
end <- getCPUTime
return (end - start)