Andere Tipps

#include <functional>
#include <iostream>

template <typename Lamba, typename Type>
auto y (std::function<Type(Lamba, Type)> f) -> std::function<Type(Type)>
{
    return std::bind(f, std::bind(&y<Lamba, Type>, f), std::placeholders::_1);
}

int main(int argc,char** argv)
{
    std::cout << y < std::function<int(int)>, int> ([](std::function<int(int)> f, int x) {
        return x == 0 ? 1 : x * f(x - 1);
    }) (5) << std::endl;
    return 0;
}
  

Können Sie erklären, wie das alles funktioniert?

fix2 ist ein y-Kombinator (genauer gesagt, es ist ein Kombinator für Funktionen mit zwei Argumenten, das erste Argument die Funktion ist (zum Zweck der Rekursion), das zweite Argument ist ein „richtiges“ Funktionsargument). Es schafft rekursive Funktionen.

BLL :: ret (...) erscheint eine Form eines Funktionsobjekt zu schaffen, deren Körper ist

if(second arg == 0)
{
    return 1;
}
else
{
    return second arg * first arg(second arg - 1);
}

Die „faul“ ist vermutlich eine unendliche Ausdehnung des ersten (Funktion) Argument zu stoppen (lesen Sie auf den Unterschied zwischen faul und strengen Y Combinator, um zu sehen, warum).

Der Code ist ziemlich schrecklich. Anonyme Funktionen sind nett zu haben, aber die hackery um C ++ 's Mangel an syntaktischer Unterstützung machen sie nicht die Mühe wert, zu arbeiten.

scroll top