haskell - lifo 队列作为光学器件
问题描述
考虑一个项目列表[a]
和一对函数
pop :: [a] -> (Maybe a, [a])
pop = headMay &&& tailSafe
push :: a -> [a] -> [a]
push = (:)
它只是为列表提供后进先出队列结构。
我可能错了,但是这个 API 感觉很不错lens
,提供了一种访问列表第一个元素的方法。但它既不是 aLens
也不是 a Prism
。
我想知道这可以实现为一个Traversal
或其他一些光学结构
解决方案
列表头部的推入和弹出可以表示为一个棱镜——从一个[a]
到可能一个(a, [a])
,从一个(a, [a])
返回到一个[a]
。存在于镜头中_Cons
:
_Cons @[a] @[b] :: Prism [a] [b] (a, [a]) (b, [b])
(这只是通过明确排除从 获取非空列表而不是元素的方式与您的 API 不同pop
,因为(Maybe a, [a])
结果类型原则上允许。)
推荐阅读
- jquery - jQuery Datetimepicker Bootstrap 4 清除并检查空
- ruby - ruby 项目和 gemification 的最佳实践
- firebase - Cloud Firestore:我可以一次取消订阅所有快照侦听器吗?
- javascript - 未应用 bootstrap v4 上的“btn-outline-*”类
- javascript - jquery增加选择输入的ID
- python - plt.savefig 从另一个文件调用时停止工作
- javascript - 在滚动 laravel ajax 上加载更多数据
- node.js - 如何附加到 Node.js 中的文件但将文件限制为特定大小
- node.js - 我们可以在 mongo 中使用什么字段类型来存储对象数组?
- powershell - 如何通过 PowerShell 使用 Azure DevOps 的内部版本号更新 AssemblyInfo.cs 中的 AssemblyVersion 号?