一个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