鏡頭和稜鏡
一個 Lens' s a
意味著你總能找到任何 s
中的 a
。一個 Prism' s a
意味著你可以有時找到 s
實際上只是為 a
但有時別的東西。
為了更清楚,我們有 _1 :: Lens' (a, b) a
因為任何元組總是有第一個元素。我們有 _Just::Prism' (Maybe a) a
因為有時 Maybe a
實際上是包含在 Just
中的 a
值,但有時它是 Nothing
。
有了這種直覺,一些標準組合器可以被解釋為彼此平行
view::Lens' s a -> (s -> a)
得到a
離開了s
set::Lens' s a -> (a -> s -> s)
設定a
的a
插槽review::Prism' s a -> (a -> s)
意識到一個a
可能是一個s
preview::Prism' s a -> (s -> Maybe a)
試圖將一個s
變成一個a
。
另一種思考方式是 Lens' s a
的值表明 s
與 (r, a)
具有相同的結構,對於某些未知的 r
。另一方面,Prism' s a
表明 s
具有與 Either r a
相同的結構。我們可以用以下知識編寫上述四個函式:
-- `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