找不到模块‘ criterion.main’试图基准Haskell时
我无法获得工作标准。我遵循教程在这里,通过执行以下操作来安装标准。
cabal update
cabal install -j --disable-tests criterion
当我尝试 ghc -o fibber.hs
或 ghc -o-make fibber
时,我会收到
[1 of 1] Compiling Main ( Fibber.hs, Fibber.o )
Fibber.hs:1:1: error:
Could not find module ‘Criterion.Main’
Use -v (or `:set -v` in ghci) to see a list of the files searched for.
|
1 | import Criterion.Main
|
我希望测试和诊断的 错误HTML文件。
尝试堆栈会导致相同的错误。我以前用自己的模块将它们包含在我的 .cabal
文件中,
library
Exposed-Modules:
Geometry.Sphere
Geometry.Cuboid
Geometry.Cube
但在这种情况下这样做并不能解决问题,我已经解决了这个问题。我还尝试了 so so so Solution ,但无用。我基本上会收到相同的错误:
/Users/me/Documents/projects/haskell/performance/criterion-1.5.13.0/Criterion/Fibber.hs:3:1: error:
Could not find module ‘CriterionMain’
Use -v (or `:set -v` in ghci) to see a list of the files searched for.
|
3 | import CriterionMain
| ^^^^^^^^^^^^^^^^^^^^
Received ExitFailure 1 when running
Raw command: /Users/me/.stack/programs/aarch64-osx/ghc-9.2.2/bin/ghc-9.2.2 -i -i/Users/me/Documents/projects/haskell/performance/criterion-1.5.13.0/Criterion/ -hide-all-packages -fdiagnostics-color=always -packagebase -O2 /Users/me/Documents/projects/haskell/performance/criterion-1.5.13.0/Criterion/Fibber.hs
Run from: /Users/me/Documents/projects/haskell/performance/criterion-1.5.13.0/Criterion/
Standard output:
[1 of 1] Compiling Main ( /Users/me/Documents/projects/haskell/performance/criterion-1.5.13.0/Criterion/Fibber.hs, /Users/me/Documents/projects/haskell/performance/criterion-1.5.13.0/Criterion/Fibber.o )
这是我的 .cabal
文件。
name: criterion
version: 1.5.13.0
synopsis: Robust, reliable performance measurement and analysis
license: BSD3
license-file: LICENSE
author: Bryan O'Sullivan <[email protected]>
maintainer: Ryan Scott <[email protected]>
copyright: 2009-2016 Bryan O'Sullivan and others
category: Development, Performance, Testing, Benchmarking
homepage: http://www.serpentine.com/criterion
bug-reports: https://github.com/haskell/criterion/issues
build-type: Simple
cabal-version: >= 1.10
extra-source-files:
README.markdown
changelog.md
examples/LICENSE
examples/*.cabal
examples/*.hs
tested-with:
GHC==7.4.2,
GHC==7.6.3,
GHC==7.8.4,
GHC==7.10.3,
GHC==8.0.2,
GHC==8.2.2,
GHC==8.4.4,
GHC==8.6.5,
GHC==8.8.4,
GHC==8.10.7,
GHC==9.0.2,
GHC==9.2.1
data-files:
templates/*.css
templates/*.tpl
templates/*.js
description:
This library provides a powerful but simple way to measure software
performance. It provides both a framework for executing and
analysing benchmarks and a set of driver functions that makes it
easy to build and run benchmarks, and to analyse their results.
.
The fastest way to get started is to read the
<http://www.serpentine.com/criterion/tutorial.html online tutorial>,
followed by the documentation and examples in the "Criterion.Main"
module.
.
For examples of the kinds of reports that criterion generates, see
<http://www.serpentine.com/criterion the home page>.
flag fast
description: compile without optimizations
default: False
manual: True
flag embed-data-files
description: Embed the data files in the binary for a relocatable executable.
(Warning: This will increase the executable size significantly.)
default: False
manual: True
library
exposed-modules:
Criterion
Criterion.Analysis
Criterion.IO
Criterion.IO.Printf
Criterion.Internal
Criterion.Main
Criterion.Main.Options
Criterion.Monad
Criterion.Report
Criterion.Types
other-modules:
Criterion.Main.Options.Internal
Criterion.Monad.Internal
other-modules:
Paths_criterion
build-depends:
-- TODO: Eventually, we should bump the lower version bounds to >=2 so that
-- we can remove some CPP in Criterion.Report. See #247.
aeson >= 1 && < 2.1,
ansi-wl-pprint >= 0.6.7.2,
base >= 4.5 && < 5,
base-compat-batteries >= 0.10 && < 0.13,
binary >= 0.5.1.0,
binary-orphans >= 1.0.1 && < 1.1,
bytestring >= 0.9 && < 1.0,
cassava >= 0.3.0.0,
code-page,
containers,
criterion-measurement >= 0.1.1.0 && < 0.2,
deepseq >= 1.1.0.0,
directory,
exceptions >= 0.8.2 && < 0.11,
filepath,
Glob >= 0.7.2,
microstache >= 1.0.1 && < 1.1,
js-chart >= 2.9.4 && < 3,
mtl >= 2,
mwc-random >= 0.8.0.3,
-- TODO: Depend on optparse-applicative-0.17 as the minimum (see #258)
optparse-applicative >= 0.13 && < 0.18,
parsec >= 3.1.0,
statistics >= 0.14 && < 0.16,
text >= 0.11,
time,
transformers,
transformers-compat >= 0.6.4,
vector >= 0.7.1,
vector-algorithms >= 0.4
if impl(ghc < 7.6)
build-depends:
ghc-prim
if !impl(ghc >= 8.0)
build-depends:
fail == 4.9.*,
semigroups
default-language: Haskell2010
ghc-options: -Wall -funbox-strict-fields
if impl(ghc >= 6.8)
ghc-options: -fwarn-tabs
if flag(fast)
ghc-options: -O0
else
ghc-options: -O2
if flag(embed-data-files)
other-modules: Criterion.EmbeddedData
build-depends: file-embed < 0.1,
template-haskell
cpp-options: "-DEMBED"
Executable criterion-report
Default-Language: Haskell2010
GHC-Options: -Wall -rtsopts
Main-Is: Report.hs
Other-Modules: Options
Paths_criterion
Hs-Source-Dirs: app
Build-Depends:
base,
base-compat-batteries,
criterion,
optparse-applicative >= 0.13
if impl(ghc < 7.6)
build-depends:
ghc-prim
if !impl(ghc >= 8.0)
build-depends:
semigroups
test-suite sanity
type: exitcode-stdio-1.0
hs-source-dirs: tests
main-is: Sanity.hs
default-language: Haskell2010
ghc-options: -Wall -rtsopts
if flag(fast)
ghc-options: -O0
else
ghc-options: -O2
build-depends:
HUnit,
base,
bytestring,
criterion,
deepseq,
tasty,
tasty-hunit
test-suite tests
type: exitcode-stdio-1.0
hs-source-dirs: tests
main-is: Tests.hs
default-language: Haskell2010
other-modules: Properties
ghc-options:
-Wall -threaded -O0 -rtsopts
build-depends:
QuickCheck >= 2.4,
base,
base-compat-batteries,
criterion,
statistics,
HUnit,
tasty,
tasty-hunit,
tasty-quickcheck,
vector,
aeson
test-suite cleanup
type: exitcode-stdio-1.0
hs-source-dirs: tests
default-language: Haskell2010
main-is: Cleanup.hs
ghc-options:
-Wall -threaded -O0 -rtsopts
build-depends:
HUnit,
base,
base-compat,
bytestring,
criterion,
deepseq,
directory,
tasty,
tasty-hunit
source-repository head
type: git
location: https://github.com/haskell/criterion.git
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
一种选项是使用依赖关系解决的重置。
另一个是创建一个集团包。
后者的一个优点是,当您发现其他依赖项时,您可以在文件中记录所有依赖项,而不必记住每次启动
cabal repl
时每次传递全部。 。另一个是您的代码将被编译而不是解释;对于性能测试而言相当重要,这大概是您需要标准的工作!One option is to use a dependency-solved REPL.
Another is to create a cabal package.
One advantage of the latter is that as you discover additional dependencies, you can make a record of all of them in a file, instead of having to remember to pass all of them every time when you start
cabal repl
. Another is that your code will be compiled, rather than interpreted; rather important for performance testing, which is presumably what you're doing if you need criterion!5分钟Cabal的解释
只是简短而不是完整的解释
Cabal
有效的工作,因此您可以理解错误。一个项目由组件组成:库和“可运行”(为了解释而组成的名称)。每个组件在
build依赖
标签下都有其自己的依赖关系集。库没有切入点,因此它们不需要
MAIN
功能,也不需要指定MAIN-IS
。 Cabal文件仅具有 a>是软件包的名称,位于标记为name
的文件顶部。您可以拥有内部库,但这就是另一个主题。在Criterion
的Cabal文件中,您会看到:name
是Criterion
(第一行)library 标签。 (依赖关系,裸露的模块等)
确实需要一个
main
功能,并且标记为main-IS
的模块。可运行的人可以是可执行的,测试套件或基准测试。 afaik将可运行的标签标记为其中之一,仅影响cabal
编译/install 通过命令:cabal build
,cabal run
,cabal Test ,
将编译库组件和测试组件,然后运行测试。从理论上讲,您可以使用cabal bench
等...例如,cabal build
将编译(默认情况下)库组件和可执行组件,可执行的组件生成一个每个可执行文件,但是<<代码> Cabal Testcriterion.main.defaultmain
作为普通可执行文件的主要函数(在Cabal文件中定义为可执行组件),在这种情况下,Cabal将生成一个独立的EXE,该EXE将运行该运行执行基准。在
Criterion
的Cabal文件中,您可以在Exectuable和三个测试套件上看到:Criterion-Report-Reterport
App
app 文件夹SANITY
,test
和清理
test> test 带有不同主文件的文件夹每个组件的每个组件都有不同的依赖关系集,尤其是,所有这些都取决于
Criterion
库,它是在library
下的同一Cabal文件中定义的组件,如上所述。那么我的错误是什么?
因此,从本质上讲,您希望
fibber.hs
文件是“可运行的”文件,可以作为独立二进制文件或项目中的基准套件。因此,您需要根据需要将其添加到Cabal文件中。作为建议,请避免将其添加到Criterion的Cabal文件中,否则您将从源中编译标准。关注@DanielWagner回答,并创建一个新项目,其中fibber.hs
是一个主文件,并将criterion
添加到其依赖项中,或使用依赖项 - 重新替代方案。5 minutes Cabal explanation
Just a brief and not complete explanation about how
cabal
works so you can understand the error.A project is made up of components: libraries and "runnables" (made up name for the sake of explanation). Each component has its own set of dependencies under
build-depends
tag.Libraries do not have an entry point, so they don't need a
main
function and do not need to specifymain-is
. A cabal file has only one public library which is the name of the package, at the top of the file tagged asname
. You can have internal libraries, but thats another topic. In thecriterion
's cabal file you see:name
iscriterion
(first line)library
tag. (dependencies, exposed modules, etc...)Runnables do need a
main
function and a module marked as themain-is
. Runnables can be a executables, test suites or benchmarks. AFAIK, labeling a runnable as one of them, only affects the waycabal
compiles/install them via commands:cabal build
,cabal run
,cabal test
,cabal bench
, etc... For examplecabal build
will compile (by default) the library component and the executable components generating binary files one per executable, butcabal test
will compile the library component and the test components, and then run the tests. In theory you can useCriterion.Main.defaultMain
as the main function for a normal executable (define as en executable component in cabal file), in this case, cabal will generate an standalone exe which will run the benchmark on execution.In the
criterion
's cabal file you see on exectuable and three test suites:criterion-report
underapp
foldersanity
,test
andcleanup
undertest
folder with different main files eachEach of this components has different dependencies sets, and in particular, all of them depend on the
criterion
library which is the component defined in the same cabal file under sectionlibrary
, as explained above.So what's goint on with my error?
So essentialy, you want the
Fibber.hs
file to be a "runnable" file, either as a standalone binary or as a benchmark suite in a project. Therefore, you need to add it to a cabal file as you prefer. As a suggestion, avoid adding it to criterion's cabal file otherwise you'll be compiling criterion from source. Follow @DanielWagner answer and create a new project in whichFibber.hs
is a main file and addcriterion
to its dependencies, or use the dependency-repl alternative.