Snaplet到SnapletLens(snaplet初始化)

时间:2013-03-10 21:38:45

标签: haskell haskell-snap-framework

在函数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方法中工作。所以问题是,如何访问Snaplet Myex的字段?在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

1 个答案:

答案 0 :(得分:2)

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

m :: Snaplet Myex
view snapletValue m :: Myex