【问题标题】:Not in scope: ‘heist’ (I'm not using Lens)不在范围内:“抢劫”(我没有使用镜头)
【发布时间】:2016-02-26 15:07:15
【问题描述】:

我在 Snap haskell 应用程序中的这段代码有错误:

import Snap.Http.Server
import Snap.Core
import Snap.Snaplet
import Snap.Snaplet.Heist
import Snap.Util.FileServe
import Snap.Util.GZip
import Heist.Interpreted
import Heist

data App = App { appHeist :: Snaplet (Heist App) }

routes :: [(ByteString, Handler App App ())]
routes = [("", serveDirectory "static")]

appInit :: SnapletInit App App
appInit = makeSnaplet "app" "An snaplet example application." Nothing $ do
    h <- nestSnaplet "" heist $ heistInit "templates"
    addRoutes routes
    return $ App h

错误是:

Not in scope: ‘heist’

我在什么包中找不到“heist”功能。

请注意,我没有使用 Lens,也不想使用。 有什么办法不使用它们并使我的代码编译?

【问题讨论】:

  • 我不熟悉 Snap 或 Heist (?) 但 Snap itself already depends on lens。如果您使用的是 Snap,那么您使用的是 lens - 除了分叉库并将其修改为不使用 lens 之外,没有其他办法。此外,虽然许多lens 类型只是类型同义词(因此您不需要实际使用lens 来使用镜头),SnapletLens 包含来自lens 的具体类型,这意味着您真的必须在这里使用镜头。

标签: haskell haskell-snap-framework


【解决方案1】:

我不熟悉 Snap,但从 nestSnaplet 的类型签名来看,您似乎需要使用某种镜头。 nestSnaplet 有签名

nestSnaplet :: ByteString -> SnapletLens v v1 -> SnapletInit b v1-> Initializer b v (Snaplet v1)

其中SnapletLens 只是来自lensAlens 的类型同义词。

这也让我怀疑 heist 最初是使用 lens 制作的 Template Haskell 派生函数。可能发生的事情是 App 曾经看起来像这样:

-- You may need to import Contol.Lens.TH
data App = App { _heist :: Snaplet (Heist App) }
makeLenses ''App

这会使heist 成为镜头。

【讨论】:

  • 请注意,任何Lens 都可以用作ALens
  • 它是通过import Pragmatic.Server.Application 语句导入的。如果你去file,你会看到data Pragmatic = { _heist :: Snaplet (Heist App) ...}后面跟makeLenses ''Pragmatic完全相同的模式
  • 还有@OskarK。,您的超链接末尾有一个额外的引号,使其成为404。
  • 它为 makeLenses ''App 抱怨“解析错误:顶层的裸表达式”
猜你喜欢
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-23
相关资源
最近更新 更多