gpt4 book ai didi

c++ - 在 c++11 中实现 Haskell 的 Maybe Monad

转载 作者:IT老高 更新时间:2023-10-28 21:36:07 26 4
gpt4 key购买 nike

我正在尝试使用 C++11 中的 lambda 函数和模板来实现来自 Haskell 的 Maybe monad。这是我目前所拥有的

#include<functional>
#include<iostream>
using namespace std;

template<typename T1>
struct Maybe
{
T1 data;
bool valid;
};

template<typename T1, typename T2>
Maybe<T2> operator>>=(Maybe<T1> t, std::function < Maybe<T2> (T1)> &f)
{
Maybe<T2> return_value;
if(t.valid == false)
{
return_value.valid = false;
return return_value;
}
else
{
return f(t.data);
}
}


int main()
{
Maybe<int> x = {5, true};
Maybe<int> y = {29, false};

auto z = [](int a) -> Maybe<int>
{
Maybe<int> s;
s.data = a+1;
s.valid = true;
return s;
};

Maybe<int> p = (x >>= z);
Maybe<int> q = (y >>= z);

cout<<p.data<<' '<<p.valid<<endl;
cout<<q.data<<' '<<q.valid<<endl;
}

当涉及到实际的 >>= 调用时,我收到一个编译器错误,提示找不到 >>= 运算符的匹配项。我对 C++11 的 lambda 函数的理解在这里失败了吗?

最佳答案

lambda 的类型不是 std::function 的特化。这是一些未命名的类型。有一个到 std::function 的转换,但这意味着类型推导不起作用。所以,在这次通话中:

Maybe<int> p = (x >>= z);

类型T2无法推断:

Maybe<T2> operator>>=(Maybe<T1> t, std::function < Maybe<T2> (T1)> &f)

从一开始就将 lambda 存储在 std::function 变量中,它应该可以工作:

std::function < Maybe<int> (int)> z = [](int a) -> Maybe<int> { ... };

但是,接受任何类型的函数对象可能更容易。这样您仍然可以将 auto 用于 lambda。

template<typename T1, typename F>
typename std::result_of<F(T1)>::type
operator>>=(Maybe<T1> t, F&& f) {
... std::forward<F>(f)(t.data);
}

关于c++ - 在 c++11 中实现 Haskell 的 Maybe Monad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9692630/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com