我正在使用镜头包进行编码。一切都很顺利,直到我尝试访问代数类型的某个字段:
import Control.Lens
data Type = A { _a :: Char } | B
makeLenses ''Type
test1 = _a (A 'a')
test2 = (A 'a') ^. a
No instance for (Data.Monoid.Monoid Char)
arising from a use of `a'
Possible fix:
add an instance declaration for (Data.Monoid.Monoid Char)
In the second argument of `(^.)', namely `a'
In the expression: (A 'a') ^. a
In an equation for `test2': test2 = (A 'a') ^. a
我可以使用 _a,但我的实际程序中的数据类型要深得多,我打算使用镜头来减少我必须做的工作量。我一直在查看镜头库,但那里有很多东西,我不确定他是否处理过这种情况,或者这只是镜头库不支持的东西。
附带说明一下,如果我实际上使用像 String 这样的幺半群而不是 Char 作为数据类型,那么它会编译并给出正确的答案,我不知道为什么。
编辑:在阅读了 hammar 的评论后,我尝试了这个,这很有效:
test2 = (A 'a') ^? a
test3 = B ^? a
但是对于必须存在的东西来说,从中获得一个可能有点奇怪。