Haskell Snaplet到SnapletLens(Snaplet初始化)
在functionHaskell 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
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
但它们在应用程序方法中不起作用。所以问题是,如何访问SnapletMyex
的字段?在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