Haskell镜头和棱镜
示例
一个Lens'sa方法,你可以随时找到a的任何s。这Prism'sa意味着您有时可以发现s实际上只是,a但有时又是其他。
更明确地说,我们有一个_1::Lens'(a,b)a 原因,因为任何元组始终都有第一个元素。我们拥有,_Just::Prism'(Maybea)a因为有时Maybea实际上是一个a包装的价值,Just但有时却是Nothing。
凭着这种直觉,一些标准的组合器可以相互平行地解释。
view::Lens'sa->(s->a)“得到”的a出来的s
set::Lens'sa->(a->s->s)“设置”a插槽s
review::Prism'sa->(a->s)“意识到”一个a可能是一个s
preview::Prism'sa->(s->Maybea)“尝试”把一个s成一个a。
另一种思考的方式是,type的值Lens'sa表明s与(r,a)未知值具有相同的结构r。另一方面,Prism'sa证明s具有与Eitherra某些相同的结构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