【问题标题】:How to use UTCTime in yesod without hidden module errors?如何在没有隐藏模块错误的情况下在 yesod 中使用 UTCTime?
【发布时间】:2012-01-24 23:48:07
【问题描述】:

我正在使用 yesod 创建一个简单的网站。

在我将 UTCTime 类型的字段添加到我的数据库模型之前,它一直有效。

我最初收到一个错误,建议我将“time-1.2.0.3”添加到我的 cabal 文件中,所以我这样做了,现在在没有建议的情况下我得到了几乎相同的错误:

Model.hs:6:8:
    Could not find module `Data.Time.Clock.UTC':
      it is a hidden module in the package `time-1.2.0.3'
      Use -v to see a list of the files searched for.

cabal生成的ghc命令行是:

"C:\Program Files (x86)\Haskell Platform\2011.2.0.1\bin\ghc.exe" --make -o dist\build\lpi\lpi.exe -hide-all-packages -fbuilding-cabal-package -package-conf dist\package.conf.inplace -i -idist\build\lpi\lpi-tmp -i. -idist\build\autogen -Idist\build\autogen -Idist\build\lpi\lpi-tmp -optP-DPRODUCTION -optP-include -optPdist\build\autogen\cabal_macros.h -odir dist\build\lpi\lpi-tmp -hidir dist\build\lpi\lpi-tmp -stubdir dist\build\lpi\lpi-tmp -package-id base-4.3.1.0-f520cd232cc386346843c4a12b63f44b -package-id bytestring-0.9.1.10-cd85f14e02463c02ba4c77d7adcdb54f -package-id clientsession-0.7.3.6-70ebb09e2b4c14267f1463cef3c932ea -package-id hamlet-0.10.5-1bacb5fe791e5cc9e28c8cf9f07c06e2 -package-id hjsmin-0.0.14-a1d374204877c150b681896452f205f4 -package-id mime-mail-0.4.1.0-05d76f10c6f18f7178113a6d760f371a -package-id monad-control-0.3.1-092d8fe82727181557b850f795f847bc -package-id persistent-0.6.4.3-6e59b956a206ce4f4a9296367507c2b8 -package-id persistent-sqlite-0.6.2.1-d32462e51baa09b53b6fd83dae922fc7 -package-id shakespeare-css-0.10.4-f8e17e4528d3a37edee74b13441720de -package-id shakespeare-js-0.10.3-dfec6b68f60671528332da06c9799659 -package-id shakespeare-text-0.10.3-a0ae9b85c3588ff2572080a6d1cdd4c3 -package-id template-haskell-2.5.0.0-7d9b1443ac5ab69e5ed705a487990deb -package-id text-0.11.1.9-a75bb47eca7b1c98d59b7697de77ca4d -package-id time-1.2.0.3-74ef6ac31cee9aec02b036978af002d2 -package-id yesod-0.9.3.4-6339564f13b46afd787d750cf9daa3bf -package-id yesod-auth-0.7.8-94a2849a33bb6f6d4c0e15615ef22bea -package-id yesod-core-0.9.3.6-a70073f17a6f050226a91a97c305403d -package-id yesod-default-0.4.1-1f30d8d893952d0661328b681d9ce291 -package-id yesod-form-0.3.4-a84ba844c230f9847bca7c0056375179 -package-id yesod-static-0.3.2-c82f332e85e2c9ba709375b8a14040a1 -O -Wall -threaded -O2 -XHaskell98 -XTemplateHaskell -XQuasiQuotes -XOverloadedStrings -XNoImplicitPrelude -XCPP -XMultiParamTypeClasses -XTypeFamilies -XGADTs -XGeneralizedNewtypeDeriving -XFlexibleContexts .\main.hs

所以 time-1.0.2.3 肯定被引用了。

所有软件包都是在过去 24 小时内下载的,因此它们应该是最新的。

如何取消隐藏 Data.Time.Clock.UTC?

【问题讨论】:

  • 您能否展示您的 .cabal 文件以准确展示您是如何添加依赖项的?
  • Data.Time.Clock.UTC 不会被time 包暴露,因此您无法从外部访问它。您不能从包中公开隐藏模块,因此唯一但不推荐的方法是重新安装 time 并更改 .cabal 文件以公开模块。 ¹如果您这样做,您的代码将无法为其他任何人工作,因为对他们来说它仍然是隐藏的。
  • Data.Time.Clock 重新导出 Data.Time.Clock.UTC(已隐藏)。您在 Model.hs 中使用了什么导入语句 - import Data.Time.Clock 不起作用?

标签: haskell yesod


【解决方案1】:

我最近遇到了同样的错误,答案是

import Data.Time

而不是

import Data.Time.Clock.UTC

因为第一个模块重新导出隐藏模块。

【讨论】:

  • 完全正确。我开始使用 UTCTime 并且 Haskell 抱怨它没有定义。所以我四处寻找,直到找到定义并导入“Data.Time.Clock.UTC”,这不起作用。更改为“Data.Time”,现在可以了。谢谢。
【解决方案2】:

听起来像是阴谋集团依赖地狱的变种。如果你运行ghc-pkg list time,我猜你会看到安装了多个版本的时间。您的应用可能使用比底层库更新的版本。

在您的 cabal 文件中,尝试精确地使用与错误消息中提到的相同版本的时间,看看是否可以解决问题。

【讨论】:

  • 不是问题(见其他答案),但感谢Yesod。我用 Haskell 一个半星期了,Yesod 用了三天,我都喜欢。
猜你喜欢
  • 2011-10-06
  • 2020-04-26
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多