首页 > 解决方案 > lifo 队列作为光学器件

问题描述

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

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

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

它只是为列表提供后进先出队列结构。

我可能错了,但是这个 API 感觉很不错lens,提供了一种访问列表第一个元素的方法。但它既不是 aLens也不是 a Prism

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

标签: haskellhaskell-lenslenses

解决方案


列表头部的推入和弹出可以表示为一个棱镜——从一个[a]到可能一个(a, [a]),从一个(a, [a])返回到一个[a]。存在于镜头_Cons

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

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


推荐阅读