在函数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'
我认为在上面的链接中,pgPool
是pgs
的镜头。
br gsp
答案 0 :(得分:2)
有两种方法可以从Myex
获得Snaplet Myex
。 Snaplet类型有Comonad个实例,这意味着您可以使用extract函数。或者,如果您不想导入Control.Comonad,则可以使用snapletValue镜头。
m :: Snaplet Myex
view snapletValue m :: Myex