【问题标题】:Snaplet to SnapletLens (snaplet initialization)Snaplet 到 SnapletLens(snaplet 初始化)
【发布时间】:2013-03-12 07:53:42
【问题描述】:

app :: SnapletInit App App 函数中,我尝试了具有几个字段的 snaplet:

m <- nestSnaplet "mys" mys $ myexInit  -- Data Myex = Myex {_foo :: Text, ...}

以后在同一个函数中:

let txt1 = myFun  m    -- myFun :: Myex -> Text    

编译器说:

Couldn't match expected type `SnapletLens a0 b0'
            with actual type `Snaplet Myex'

我试图用

定义一个SnapletLens
class MyLens b where
  myLens :: SnapletLens b Myex

但问题是,这是获取或设置 myex-snaplet 内容的方法吗?以及如何引用myex的字段?我尝试了几件事,比如

let txt = (foo . myLens) m

但它们在 app 方法中不起作用。那么问题来了,如何访问 SnapletMyex 的字段呢?在myFun 中,镜头的使用很简单,或者至少所有内容都可以编译。

我刚刚看到另一个看起来非常相似的答案。 Use subsnaplet during snaplet initialization?

但是,如果我替换

let txt1 = myFun  m    -- myFun :: Myex -> Text    

let txt1 = foo  m    

编译器现在说:

Couldn't match expected type `T.Text -> f0 T.Text'
            with actual type `Snaplet Myex'

我假设在上面的链接中pgPoolpgs 的镜头。

br gsp

【问题讨论】:

    标签: haskell haskell-snap-framework


    【解决方案1】:

    您可以通过两种方式从Snaplet Myex 获取MyexSnaplet 类型有一个Comonad 实例,这意味着您可以使用extract 函数。或者,如果您不想导入 Control.Comonad,可以使用snapletValue 镜头。

    m :: Snaplet Myex
    view snapletValue m :: Myex
    

    【讨论】:

    • 谢谢!两者都有效,我能够以对我来说很自然的方式构建它。 (我已经开始思考,如果整个事情可以以其他方式重述。)无论如何,我认为在寻找替代解决方案之前尝试了解一些关于共胞的东西会更好......
    • 你并不需要对comonads了解太多。您只需要知道comonad 是一个容器(w a 类型),您可以从中提取一些东西(a 类型)。在这里,您只是使用extract 函数作为访问器来获取存储在Snaplet Myex 数据类型中的Myex
    猜你喜欢
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多