c++ - std::unique_ptr 可以被认为是一个单子吗?
问题描述
我目前正试图将我的头包裹在单子上。不幸的是,大多数关于该主题的文章都使用 Haskell 没有正确解释符号。然而,由于我主要使用 C++ 进行编程,所以我想在不学习新的编程语言的情况下理解 monad...
根据我在网上收集的信息,monadM
是 type 的类型构造函数T
,它至少提供以下操作:
- 构造类型的实际方法
T
- 用于将任意类型转换为的转换器(在 Haskell 中
T
显然称为return ) - 用于将存储的值应用
T
到函数的组合器(在 Haskell 中f
显然称为绑定)
将这些标准应用于 C++,在我看来,这std::unique_ptr
可以被视为一个单子。这是真的?
我的推理如下:
std::unique_ptr
模板用于构造实际类型,因此std::unique_ptr<T>
:
- 类型构造函数是
std::unique_ptr<T>{}
或者std::make_unique<T>()
- 转换器再次将是构造函数或
std::make_unique
(带有参数......) - 组合器可以是
std::bind(func, pointer.get())
,std::bind(func, *pointer)
或等效的 lambda
您是否同意,或者对组合器的operator*()
/调用是否会.get()
取消std::unique_ptr
成为 monad 的资格?
我明白了,std::unique_ptr
用作 monad 可能没有意义,因为它带有所有者语义。我只是想知道,如果它是一个。
解决方案
推荐阅读
- r - 某些列和整个数据框的总和
- mysql - 如何根据以前的列值更新 sql 列
- python - 在为 django 模型创建 TextField 值时扫描三引号字符串文字时的 EOF。(如何正确连接字符串)
- javascript - CSS Rotate 与 Stacking Context Electron APP 混淆
- mysql - Flutter 连接到 localhost DB 时出错
- c# - HtmlAgilityPack 一次选择多行
- kotlin - 在 Kotlin 中将一对列表展平为列表的惯用方法
- python - 如何制作一个python程序来重复执行几个任务相同的次数但每个任务都有独立的时间间隔?
- python - 您如何检查特定用户是否对带有许多特定表情符号的特定消息做出反应
- rust - 如何设置响应的状态码?