2

在功能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使用很简单,或者至少一切都可以编译。

我刚刚看到另一个看起来非常相似的答案。 在 snaplet 初始化期间使用 subsnaplet?

但是,如果我更换

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'

我假设在上面的链接中pgPool是一个镜头pgs

br gsp

4

1 回答 1

2

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

m :: Snaplet Myex
view snapletValue m :: Myex
于 2013-03-11T14:32:13.597 回答