如何测试lambda演算? 我在C++中实现了lambda演算,但现在我不知道如何才能摆脱它。我想测试我的函数是否返回正确的结果,但我无法比较结果,因为这是一个函数。有人知道如何测试我的代码吗 #include <functional> class function : public std::function<function (function)> { public: using type = std::function<function (function)>; public: using type::function; }; function True = [](function x) { return [&](function y) { return x; }; }; function False = [](function x) { return [&](function y) { return y; }; }; function If = [](function x) { return [&](function y) { return [&](function z) { return x(y)(z); }; }; }; function And = [](function x) { return [&](function y) { return x(y)(x); }; }; function Or = [](function x) { return [&](function y) { return x(x)(y); }; }; // ... int main() { // ? } #包括 类功能: 公共std::函数{ 公共:使用类型= std::函数; public:使用type::function; }; 函数True=[](函数x){ 返回[&](函数y){ 返回x; }; }; 函数False=[](函数x){ 返回[&](函数y){ 返回y; }; }; 函数If=[](函数x){ 返回[&](函数y){ 返回[&](函数z){ 返回x(y)(z); }; }; }; 函数And=[](函数x){ 返回[&](函数y){ 返回x(y)(x); }; }; 函数Or=[](函数x){ 返回[&](函数y){ 返回x(x)(y); }; }; // ... int main() { // ? }
我用以下测试代码解决了我的问题如何测试lambda演算? 我在C++中实现了lambda演算,但现在我不知道如何才能摆脱它。我想测试我的函数是否返回正确的结果,但我无法比较结果,因为这是一个函数。有人知道如何测试我的代码吗 #include <functional> class function : public std::function<function (function)> { public: using type = std::function<function (function)>; public: using type::function; }; function True = [](function x) { return [&](function y) { return x; }; }; function False = [](function x) { return [&](function y) { return y; }; }; function If = [](function x) { return [&](function y) { return [&](function z) { return x(y)(z); }; }; }; function And = [](function x) { return [&](function y) { return x(y)(x); }; }; function Or = [](function x) { return [&](function y) { return x(x)(y); }; }; // ... int main() { // ? } #包括 类功能: 公共std::函数{ 公共:使用类型= std::函数; public:使用type::function; }; 函数True=[](函数x){ 返回[&](函数y){ 返回x; }; }; 函数False=[](函数x){ 返回[&](函数y){ 返回y; }; }; 函数If=[](函数x){ 返回[&](函数y){ 返回[&](函数z){ 返回x(y)(z); }; }; }; 函数And=[](函数x){ 返回[&](函数y){ 返回x(y)(x); }; }; 函数Or=[](函数x){ 返回[&](函数y){ 返回x(x)(y); }; }; // ... int main() { // ? },c++,function,functional-programming,lambda-calculus,purely-functional,C++,Function,Functional Programming,Lambda Calculus,Purely Functional,我用以下测试代码解决了我的问题 #include <cassert> #include <exception> template <typename E, typename F> bool throws(F f) try { f(); return false; } catch (E const &) { return true; } auto main() -> int { function Null;
#include <cassert>
#include <exception>
template <typename E, typename F>
bool throws(F f)
try {
f();
return false;
}
catch (E const &) {
return true;
}
auto main() -> int
{
function Null;
assert(throws<std::bad_function_call>([&] { True(Null)(True)(True); }));
assert(throws<std::bad_function_call>([&] { False(True)(Null)(True); }));
}
有人知道如果我通过引用捕获它为什么不起作用吗?我的代码现在看起来是这样的(我刚刚用
[&]
替换了所有[=]
并使用了私有继承):
将标签添加到
函数
?使用“获取指向存储的指针”api?传递null/notnull函数并使用运算符bool?谢谢@Yakk AdamNevraumont!我不想修改类函数
,但我可以检查在尝试调用返回的null函数时是否出现异常。当我编写测试时,我将为我的问题写一个答案。您可以执行函数并断言结果谢谢@AlessandroTeruzzistd::function
不是要从中继承的,它没有一个我知道这个解决方案很复杂。我正在重写它。
function True = [](function x) {
return [=](function y) {
return x;
};
};
class function :
private std::function<function (function)> {
public: using type =
std::function<function (function)>;
public: using type::function;
public: using type::operator();
public: using type::operator bool;
};
function True = [](function t) {
return [=](function f) {
return t;
};
};
function False = [](function t) {
return [=](function f) {
return f;
};
};
function If = [](function x) {
return [=](function t) {
return [=](function f) {
return x(t)(f);
};
};
};
function And = [](function x) {
return [=](function y) {
return x(y)(x);
};
};
function Or = [](function x) {
return [=](function y) {
return x(x)(y);
};
};
auto main() -> int
{
function Null;
assert( True(True)(Null));
assert(!True(Null)(True));
assert( False(Null)(True));
assert(!False(True)(Null));
assert( If(True )(True)(Null));
assert(!If(True )(Null)(True));
assert( If(False)(Null)(True));
assert(!If(False)(True)(Null));
assert(And(False)(False) (Null)(True));
assert(And(False)(True ) (Null)(True));
assert(And(True )(False) (Null)(True));
assert(And(True )(True ) (True)(Null));
assert(Or(False)(False) (Null)(True));
assert(Or(False)(True ) (True)(Null));
assert(Or(True )(False) (True)(Null));
assert(Or(True )(True ) (True)(Null));
}