在Haskell中,该跨Monad转换函数对应的概念名称是什么?
寻找函数式编程中等价概念的名称
我正在用C++编写偏函数式风格的代码,想避免命名不当的问题,所以希望尽量采用Haskell里对应概念的名称(我对Haskell不算熟悉,但相关资料给了我不少启发)。
如果我的Haskell类型定义是正确的,我要找名称的概念签名如下:
someName :: (Monad m1, Monad m2) => (a -> m1 b) -> (m2 a -> m1 m2 b)
它的核心逻辑是:把原本适用于Monad m1绑定操作的函数,转换成能处理嵌套了m2类型值的m1绑定操作的函数。
我不太熟练写Haskell示例,但下面是用std::optional和absl::StatusOr实现的伪C++示例:
// 一个针对 absl::StatusOr<int> 的简单绑定函数示例 absl::StatusOr<int> AddTwoUnless17(int x) { if (x == 17) { return absl::InternalError("can't add two to 17!"); } return x + 2; } // 将 AddTwoUnless17 转换为适用于 absl::StatusOr<std::optional<int>> 的绑定函数 // 最终逻辑如下: // // * 若输入是错误,直接传播该错误 // * 若输入是 std::nullopt,返回 std::nullopt // * 若输入是17,返回错误 // * 其他情况返回输入值加2 // // 这里对应的类型: // // m1: absl::StatusOr // m2: std::optional // std::function<absl::StatusOr<std::optional<int>>(std::optional<int>)> f = someName(AddTwoUnless17); CHECK_EQ( absl::CancelledError(), f(absl::StatusOr<std::optional<int>>(absl::CancelledError()))); CHECK_EQ( std::nullopt, f(absl::StatusOr<std::optional<int>>(std::nullopt))); CHECK_EQ( absl::InternalError("can't add two to 17!"), f(absl::StatusOr<std::optional<int>>(17))); CHECK_EQ( 13, f(absl::StatusOr<std::optional<int>>(11)));
**请问这个概念有没有对应的名称?**如果没有,是因为它存在设计缺陷,还是可以用更基础的函数式组件组合出来?
内容的提问来源于stack exchange,提问作者jacobsa
相关产品推荐
相关产品推荐

