鏡頭和稜鏡

一個 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)設定aa 插槽
  • 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