Haskell Snaplet到SnapletLens(Snaplet初始化)

Haskell Snaplet到SnapletLens(Snaplet初始化),haskell,haskell-snap-framework,Haskell,Haskell Snap Framework,在functionapp::SnapletInit app中,我尝试了包含两个字段的snaplet: m <- nestSnaplet "mys" mys $ myexInit -- Data Myex = Myex {_foo :: Text, ...} 编译器说: Couldn't match expected type `SnapletLens a0 b0' with actual type `Snaplet Myex' 我试图用 class MyLen

在function
app::SnapletInit app
中,我尝试了包含两个字段的snaplet:

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

Couldn't match expected type `SnapletLens a0 b0'
            with actual type `Snaplet Myex'
我试图用

class MyLens b where
  myLens :: SnapletLens b Myex
但问题是,这是获取或设置myex snaplet内容的方法吗?如何引用myex的字段?我试过几种方法,比如

let txt = (foo . myLens) m
但它们在应用程序方法中不起作用。所以问题是,如何访问Snaplet
Myex
的字段?在
myFun
中,镜头的使用非常简单,或者至少所有的东西都可以编译

我刚刚看到了另一个看起来非常相似的答案。

但是,如果我替换

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

编译器现在说:

Couldn't match expected type `T.Text -> f0 T.Text'
            with actual type `Snaplet Myex'
我假设在上面的链接中,
pgPool
pgs
的镜头


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


非常感谢。这两种方法都很有效,我能够以我认为自然的方式来构建它。(我已经开始思考,如果整个事情可以用其他方式重述的话。)无论如何,我认为在找到替代解决方案之前,最好先尝试了解一些关于comonads的知识……你不必为此对comonads有太多了解。您需要知道的是,comonad是一个容器(类型为
wa
),您可以从中提取某些内容(类型为
a
)。在这里,您只需使用
extract
函数作为访问器来获取存储在
Snaplet Myex
数据类型中的
Myex
let txt1 = foo  m    
Couldn't match expected type `T.Text -> f0 T.Text'
            with actual type `Snaplet Myex'
m :: Snaplet Myex
view snapletValue m :: Myex