Haskell镜头和棱镜

示例

一个Lens' s a方法,你可以随时找到a的任何s。这Prism' s a意味着您有时可以发现s实际上只是 a但有时又是其他。

更明确地说,我们有一个_1 :: Lens' (a, b) a  原因,因为任何元组始终都有第一个元素。我们拥有,_Just :: Prism' (Maybe a) a因为有时 Maybe a实际上是一个a包装的价值,Just但有时却是Nothing。

凭着这种直觉,一些标准的组合器可以相互平行地解释。

  • view :: Lens' s a -> (s -> a)“得到”的a出来的s

  • set :: Lens' s a -> (a -> s -> s)“设置”a插槽s

  • review :: Prism' s a -> (a -> s)“意识到”一个a可能是一个s

  • preview :: Prism' s a -> (s -> Maybe a)“尝试”把一个s成一个a。

另一种思考的方式是,type的值Lens' s a表明s与(r, a)未知值具有相同的结构r。另一方面,Prism' s a证明s具有与Either r a某些相同的结构r。我们可以利用这些知识来编写上面的四个函数:

-- `Lens' s a` is no longer supplied, instead we just *know* that `s ~ (r, a)`

view :: (r, a) -> a
view (r, a) = a

set :: a -> (r, a) -> (r, a)
set a (r, _) = (r, a)

-- `Prism' s a` is no longer supplied, instead we just *know* that `s ~ Either r a`

review :: a -> Either r a
review a = Right a

preview :: Either r a -> Maybe a
preview (Left _) = Nothing
preview (Right a) = Just a