【发布时间】:2018-11-16 12:27:57
【问题描述】:
这段代码编译运行没有问题:
module Main where
import Criterion.Main
main :: IO ()
main =
defaultMain
[env (return $ [1,2])
(\is ->
bgroup "group" (benchmarks is))]
timesTwo :: Int -> Int
timesTwo i = 2 * i
benchmarks :: [Int] -> [Benchmark]
benchmarks is = [ bench "foo" $ nf timesTwo (is !! 0)
, bench "foo" $ nf timesTwo (is !! 1) ]
但是,如果我将 benchmarks 函数更改为如下所示
benchmarks :: [Int] -> [Benchmark]
benchmarks is = map (\i -> bench "foo" $ nf timesTwo i) is
它仍然可以编译,但我得到这个运行时错误:
ghci> main
*** Exception: Criterion atttempted to retrieve a non-existent environment!
Perhaps you forgot to use lazy pattern matching in a function which
constructs benchmarks from an environment?
(see the documentation for `env` for details)
我该如何解决这个问题?
如您所见,我的目标是映射从环境中获得的列表,以便将其转换为可以与 Criterion 一起使用的 Benchmarks 列表。 p>
注意:我最终想要使用比两个更多的元素,所以元组不是我想要的。
【问题讨论】:
-
如何从环境中获取列表?你会静态知道它的长度吗?
-
@oisdk 在实践中,我将在编译时使用我自己知道的数字。想一想:[100, 1000, 10000, 1000000] 我的目标是做一个“大 O”基准。 (如果您知道的话,请随意提出更好的“大 O”分析方法。)