如何测试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函数时是否出现异常。当我编写测试时,我将为我的问题写一个答案。您可以执行函数并断言结果谢谢@AlessandroTeruzzi
std::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));
}