【问题标题】:Haskell Criterion Usage ErrorHaskell 标准使用错误
【发布时间】:2011-12-11 08:29:45
【问题描述】:

以下代码名为fib.hs

import Criterion.Main (defaultMain)
fibZ = 1:1:zipWith (+) fibZ (tail fibZ)
main = defaultMain [
         bench "fibZ 10" $ \n -> fibZ (10+n-n)
       ]

错误

fib.hs:45:10: Not in scope: `bench'

怎么了?这个例子是从here借来的。

【问题讨论】:

    标签: haskell package benchmarking ghc criterion


    【解决方案1】:

    使用

    import Criterion.Main
    

    而不是

    import Criterion.Main (defaultMain)
    

    Criterion.Main 中的函数 bench 不在作用域内,因为您只导入了 defaultMain。不需要使用bgroup

    这是一个完整的工作示例:

    import Criterion.Main
    
    fib :: Int -> Int
    fib 0 = 0
    fib 1 = 1
    fib n = fib (n-1) + fib (n-2)
    
    main = defaultMain [
             bench "fib 10" $ nf fib 10
           , bench "fib 30" $ nf fib 30
           , bench "fib 35" $ nf fib 35
           ]
    

    如果您想知道这些 nf 的用途是什么,请查看文档中的 this section

    【讨论】:

    • 您对我的代码错误为fib.hs:53:37: Not in scope: data constructor B' 失败,模块已加载:无。` 抱歉,我真的是 Haskell 的新手。
    • 您可能在谈论 Jeremy 的代码 - 他从文档页面复制粘贴了他的示例以获取旧版本的标准。我的编译没有错误。
    • 叹息,现在代码加载了,但是当我调用 main:Loading package double-conversion-0.2.0.1 ... can't load .so/.DLL for: stdc++ (libstdc++.so: cannot open shared object file: No such file or directory) 时却出现错误。我在 Ubuntu 11.10 上使用 GHC 7.0.4。
    • 我认为这是一个已知的错误 - 幸运的是,这只发生在您尝试在 GHCi 中运行程序时。尝试编译(使用ghc --make -O2)。
    • 我最初的猜测是正确的——你有一个旧版本的 gtk2hs-buildtools,因为build tools are not considered dependencies by cabal-install,你应该手动更新它们。执行cabal install gtk2hs-buildtools,然后执行cabal install --reinstall criterion -fChart -fgtk
    【解决方案2】:

    自那篇博文撰写以来,图书馆发生了变化。现在你应该写:

     import Criterion.Main
    
     fib :: Int -> Int
     fib 0 = 0
     fib 1 = 1
     fib n = fib (n-1) + fib (n-2)
    
     main = defaultMain [
            bgroup "fib" [ bench "fib 10" $ B fib 10
                         , bench "fib 35" $ B fib 35
                         , bench "fib 37" $ B fib 37
                         ]
                        ]
    

    这直接取自the Hackage documentation for Criterion.Main 的“运行基准”部分。

    【讨论】:

      猜你喜欢
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 2011-04-17
      • 2013-05-11
      • 2011-09-20
      • 1970-01-01
      相关资源
      最近更新 更多