考虑这些类型:
data A = A { a :: Int }
data B = B { a :: Int } -- a again!
data C = C1 A | C2 B
是否有一种方法从C
对象获得a
与一些镜头(棱镜?)返回Int
而不是Maybe Int
?因为使用模式匹配(或者使用RecordWildCards
):
case c of
C1 c1 -> a c1
C2 c2 -> a c2
我可以得到Int
,但与镜头/棱镜我想我总是会得到Maybe Int
。有可能用镜头来完成吗?我的直觉是,镜头不知道"确定性"。a
accessor大于C
,不能为Maybe
…
你可以定义自己的镜头
aC :: Lens' C Int
--aC:: Functor f => (Int -> f Int) -> C -> f C
aC f (C1 (A x)) = fmap (C1 . A) $ f x
aC f (C2 (B x)) = fmap (C2 . B) $ f x
为你做练习:检查这是否符合镜头法则。