这里有什么不对,懒惰评价呢?
teste.hs
module Main where
import Control.Parallel(par,pseq)
import Text.Printf
import Control.Exception
import System.CPUTime
import Data.List
import IO
import Data.Char
import Control.DeepSeq
--Calcula o tempo entre o inicio e o fim de rodagem do programa
time :: IO t -> IO t
time a = do
start <- getCPUTime
v <- a
end <- getCPUTime
let diff = (fromIntegral (end - start)) / (10^12)
printf "Computation time: %0.3f sec\n" (diff :: Double)
return v
learquivo :: FilePath -> IO ([[Int]])
learquivo s = do
conteudo <- readFile s
return (read conteudo)
main :: IO ()
main = do
conteudo <- learquivo "mkList1.txt"
mapasort <- return (map sort conteudo)
time $ mapasort `seq` return ()
*Main> main
Computation time: 0.125 sec
mkList1.txt是100个随机数列表中的100个列表,大致或多或少如下:[[23,45,89,78,89 ...],[4783,44,34 ... ] ...]
我做了一个测试打印mapasort:
计算时间大大增加,所以我觉得有些不对劲。
Computation time: 1.188 sec
由于
答案 0 :(得分:6)
是的,这是由于Haskell的懒惰造成的。你试图通过使用seq
来解决懒惰问题,但是因为seq
是“浅的”(即它不会遍历表达式的整个结构 - 只有“外部”层),它会强制评估map
,但不会评估sort
的评估。
要解决此问题,请使用deepseq
代替seq
,或者更好的是,使用库进行基准测试,而不是使用getCPUTime
。