Referenčně transparentní rekurzivní anonymní funkce v Pythonu a C++

RecursiveFarts

Jde nějak napsat v Pythonu a C++ rekurzivní anonymní funkce? Mám například [1, 2, 3, 4, 5].fmap(fact) pro faktoriál, ale místo zvlášť definované funkce fact chci mít jako argument fmapu jen lambda výraz. V podstatě něco jako Recall v R, ale to zjevně Python nemá a C++ už vůbec ne.


Ivan Nový

Kód: [Vybrat]
fact = lambda x: C

nebo
Kód: [Vybrat]
def fun(x):
    return 1 if x == 0 else x * fact(x-1)
map(fun, [1, 2, 3, 4])

Ivan Nový

Ten první způsob se neuložil celý, zde je kompletní
fact = lambda x: 1 if x == 0 else x * fact(x-1)

Ivan Nový

A ten druhý je taky blbě, nyní správně
Kód: [Vybrat]
def fact(x):
    return 1 if x == 0 else x * fact(x-1)
map(fact, [1, 2, 3, 4])

Trader

A ten druhý je taky blbě, nyní správně
Kód: [Vybrat]
def fact(x):
    return 1 if x == 0 else x * fact(x-1)
map(fact, [1, 2, 3, 4])
To není anonymní, otázka zněla, jak dát ten lambda výraz přímo do volání mapu jako parametr.


DK


Trader

Mozne to je, ale nevim, zda tohle zrovna v Pythonu chces delat

https://stackoverflow.com/questions/481692/can-a-lambda-function-call-itself-recursively-in-python
To Y jde taky udělat jako callable. V tom C++ jako funktor (ve dvou ze tři smyslů tohoto slova).

Ivan Nový

A ten druhý je taky blbě, nyní správně
Kód: [Vybrat]
def fact(x):
    return 1 if x == 0 else x * fact(x-1)
map(fact, [1, 2, 3, 4])
To není anonymní, otázka zněla, jak dát ten lambda výraz přímo do volání mapu jako parametr.

To je zvěrstvo, nepythonické :-) Lambdy nepoužívat. V Pythonu by se mělo programovat pythonicky, to hlavní výhoda Pythonu, vlastní odlišná filosofie, a ne erovsky. Navíc rekurzi raději obcházet.

Bacsa

A ten druhý je taky blbě, nyní správně
Kód: [Vybrat]
def fact(x):
    return 1 if x == 0 else x * fact(x-1)
map(fact, [1, 2, 3, 4])
To není anonymní, otázka zněla, jak dát ten lambda výraz přímo do volání mapu jako parametr.
To je zvěrstvo, nepythonické :-) Lambdy nepoužívat. V Pythonu by se mělo programovat pythonicky, to hlavní výhoda Pythonu, vlastní odlišná filosofie, a ne erovsky. Navíc rekurzi raději obcházet.
To je otázka na samodružný bod funkce vyššího řádu. V dynamickém jazyce to je vskutku zvěrstvo. Ale v tom C++ to už smysl má. Co je “erovsky”?

Kojot

... a C++ už vůbec ne.
Ale dá se.
Kód: [Vybrat]
constexpr auto fact = [](unsigned int i) {
    constexpr auto recursive = [](unsigned int i, auto &self) -> unsigned int {
        return i ? i * self(i - 1, self) : 1;
    };
    return recursive(i, recursive);
};
static_assert(fact(3) == 6);
static_assert(fact(4) == 24);

ByCzech

  • *****
  • 1 809
    • Zobrazit profil
    • E-mail
Re:Referenčně transparentní rekurzivní anonymní funkce v Pythonu a C++
« Odpověď #10 kdy: 17. 08. 2018, 12:38:57 »
Co je “erovsky”?

IMHO myslí způsob programování typický pro jazyk R

Bacsa

Re:Referenčně transparentní rekurzivní anonymní funkce v Pythonu a C++
« Odpověď #11 kdy: 17. 08. 2018, 12:43:43 »
... a C++ už vůbec ne.
Ale dá se.
Kód: [Vybrat]
constexpr auto fact = [](unsigned int i) {
    constexpr auto recursive = [](unsigned int i, auto &self) -> unsigned int {
        return i ? i * self(i - 1, self) : 1;
    };
    return recursive(i, recursive);
};
static_assert(fact(3) == 6);
static_assert(fact(4) == 24);
Ano, dá se, ale jinak, tohle není anonymní. Jak to bude bez použití “recursive”?

Kojot

Re:Referenčně transparentní rekurzivní anonymní funkce v Pythonu a C++
« Odpověď #12 kdy: 17. 08. 2018, 13:19:18 »
... a C++ už vůbec ne.
Ale dá se.
Kód: [Vybrat]
constexpr auto fact = [](unsigned int i) {
    constexpr auto recursive = [](unsigned int i, auto &self) -> unsigned int {
        return i ? i * self(i - 1, self) : 1;
    };
    return recursive(i, recursive);
};
static_assert(fact(3) == 6);
static_assert(fact(4) == 24);
Ano, dá se, ale jinak, tohle není anonymní. Jak to bude bez použití “recursive”?
Dobře, tak anonymně a bez použití recursive  ;D.
Kód: [Vybrat]
static_assert([](unsigned int i) {
    constexpr auto not_recursive = [](unsigned int i, auto &self) -> unsigned int {
        return i ? i * self(i - 1, self) : 1;
    };
    return not_recursive(i, not_recursive);
}(3) == 6);

Bacsa

Re:Referenčně transparentní rekurzivní anonymní funkce v Pythonu a C++
« Odpověď #13 kdy: 17. 08. 2018, 13:22:17 »
... a C++ už vůbec ne.
Ale dá se.
Kód: [Vybrat]
constexpr auto fact = [](unsigned int i) {
    constexpr auto recursive = [](unsigned int i, auto &self) -> unsigned int {
        return i ? i * self(i - 1, self) : 1;
    };
    return recursive(i, recursive);
};
static_assert(fact(3) == 6);
static_assert(fact(4) == 24);
Ano, dá se, ale jinak, tohle není anonymní. Jak to bude bez použití “recursive”?
Dobře, tak anonymně a bez použití recursive  ;D.
Kód: [Vybrat]
static_assert([](unsigned int i) {
    constexpr auto not_recursive = [](unsigned int i, auto &self) -> unsigned int {
        return i ? i * self(i - 1, self) : 1;
    };
    return not_recursive(i, not_recursive);
}(3) == 6);
Furt blbě.

Kojot

Re:Referenčně transparentní rekurzivní anonymní funkce v Pythonu a C++
« Odpověď #14 kdy: 17. 08. 2018, 13:33:09 »
Furt blbě.
Je lepší psát k tématu, a ne jak se cítíš  ;D.