我正在尝试使用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; …Run Code Online (Sandbox Code Playgroud) 我正在玩haskell,从简单的绘图程序开始弄湿我的脚.我需要一个库,让我将2D数组/矢量保存到图像文件中.我不想写一份颜色列表.我想使用用于数组/矢量计算的容器,并且可以(好吧,几乎)自动并行化.
编辑存储彩色图像的能力是必须的.
我需要什么?[无序列表]
我看到了什么?
所以,请帮我选择.
编辑 A = B + C指的是元素加法,而不是列表串联
以下代码输出0,1,32,33.至少可以说这是违反直觉的.但是如果我用类型annonated constant"ONE"替换文字1,循环运行正常.
这是使用gcc 4.6.2和-std = c ++ 0x.
#include<iostream>
#include<cstdint>
using namespace std;
int main()
{
int64_t bitmask = 3;
int64_t k;
const int64_t ONE = 1;
cout<<"bitmask = "<<bitmask<<endl;
for(k=0; k<64; k++)
{
if(bitmask & (1<<k))
{
cout<<"k="<<k<<endl;
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编辑 问题:正如Ben指出的那样,默认情况下,1被视为32位宽.当它的协同操作数是64位时,为什么它不会被提升为64位.
解
没有.<<不要求每一方都有相同的类型.毕竟,为什么当可用的最大移位适合char时,右侧是int64_t?促销仅在您处理算术运算符而非所有运算符时发生.
复制自Bill的评论如下
我有一个c ++类,我试图使用SWIG为Python包装.我在尝试包装一个以数组作为输入的函数时遇到了麻烦.
这是头文件,
class dyndiff_data_t
{
private:
double H[3];
double GAMMA;
double k;
double P;
public:
dyndiff_data_t(double H_[3],
const double GAMMA_,
const double k_,
const double P_);
void test();
};
Run Code Online (Sandbox Code Playgroud)
这是swig接口文件,
%module twowave
%{
#define SWIG_FILE_WITH_INIT
#include <twowave.h>
%}
%include "numpy.i"
%init %{
import_array();
%}
%apply (double IN_ARRAY1[3]) {(double H_[3])};
%include <twowave.h>
Run Code Online (Sandbox Code Playgroud)
问题是对于数组输入,SWIG抱怨没有类型映射.我不明白为什么.numpy.i文件是从这里获取的,我在这里使用的是我使用的类型映射
任何帮助,将不胜感激.
这是代码.
#include<struct.h>
#include<iostream>
#include<functional>
using namespace std;
void LambdaTest(const function <struct dummy (void)>& f)
{
struct dummy test = f();
cout<<test.a<<endl;
}
int main()
{
int val = 5;
struct dummy dum;
auto func = [val](void) -> struct dummy
{
dummy temp;
temp.a = val;
return temp;
};
LambdaTest(func);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
文件struct.h非常简单.
struct dummy
{
int a;
};
Run Code Online (Sandbox Code Playgroud)
海湾合作委员会抱怨说
lambda_struct.cpp:19:38:错误:字段'temp'的类型不完整
这是允许的吗?如果是,那我该如何解决呢?如果没有,那么为什么不呢?
编辑:
代码中的返回类型错误(由他人发现)现在已得到修复.
解:
问题是C++ 0x标准允许在lambda定义本身的返回类型中定义一个新结构(也可能是一个类).因此,如果返回类型中存在struct关键字,编译器将认为它是一种新类型并开始抱怨.
固定代码是
#include<struct.h>
#include<iostream>
#include<functional>
using namespace std;
void LambdaTest(const function <struct …Run Code Online (Sandbox Code Playgroud)