这里出了什么问题,惰性求值也是吗?
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<br/> Computation time: 0.125 sec
mkList1.txt 是一个由 100 个列表组成的列表,每个列表有 100 个随机数,或多或少像这样:[[23,45,89,78,89 ...], [4783, 44, 34 ... ]...]
我做了一个测试打印映射排序:
- time $ print("对usando map进行排序=",mapasort)
计算时间显着增加,所以我认为出了问题。
Computation time: 1.188 sec
谢谢
最佳答案
是的,这是由于 Haskell 的懒惰造成的。您试图通过使用 seq
来解决惰性问题,但由于 seq
是“浅层”的(即它不会遍历表达式的整个结构 - 仅遍历“outer”层),它将强制评估map
,但不会评估sort
。
要解决此问题,可以使用 deepseq
而不是 seq
,或者更好的是,使用基准测试库而不是使用 getCPUTime
。
关于haskell - 基准测试和惰性评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3988477/