后进先出队列作为光学

lifo queues as optics

考虑一个项目列表 [a] 和一对函数

pop :: [a] -> (Maybe a, [a])
pop = headMay &&& tailSafe

push :: a -> [a] -> [a]
push = (:)

这只是为列表提供了一个后进先出的队列结构。

我可能错了,但是 API 感觉非常 lensy,提供了一种访问列表第一个元素的方法。它仍然既不是 Lens 也不是 Prism

我想知道这可以实现为 Traversal 或其他光学结构

列表头部的推入和弹出可以表示为一个棱镜——从 [a] 到可能是 (a, [a]),然后从 (a, [a]) 回到 [a].在 lens 中存在 _Cons:

_Cons @[a] @[b] :: Prism [a] [b] (a, [a]) (b, [b])

(这与您的 API 不同,明确排除了获取非空列表而不是来自 pop 的元素,因为原则上 (Maybe a, [a]) 结果类型会, 允许。)