后进先出队列作为光学
lifo queues as optics
考虑一个项目列表 [a]
和一对函数
pop :: [a] -> (Maybe a, [a])
pop = headMay &&& tailSafe
push :: a -> [a] -> [a]
push = (:)
这只是为列表提供了一个后进先出的队列结构。
我可能错了,但是 API 感觉非常 lens
y,提供了一种访问列表第一个元素的方法。它仍然既不是 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])
结果类型会, 允许。)
考虑一个项目列表 [a]
和一对函数
pop :: [a] -> (Maybe a, [a])
pop = headMay &&& tailSafe
push :: a -> [a] -> [a]
push = (:)
这只是为列表提供了一个后进先出的队列结构。
我可能错了,但是 API 感觉非常 lens
y,提供了一种访问列表第一个元素的方法。它仍然既不是 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])
结果类型会, 允许。)