镜头 ( "prism" ?) 可用于从嵌套子记录中获取字段



考虑这些类型:

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。有可能用镜头来完成吗?我的直觉是,镜头不知道"确定性"。aaccessor大于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

为你做练习:检查这是否符合镜头法则。

相关内容

  • 没有找到相关文章

最新更新