鏡頭和稜鏡
一個 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離開了sset::Lens' s a -> (a -> s -> s)設定a的a插槽review::Prism' s a -> (a -> s)意識到一個a可能是一個spreview::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