Wyrażenie Lambda

S5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 58
0
  1. Napisz funkcję (zwykłą), która przyjmuje parametr typu int. Funkcja powinna zwrócić funkcję lambda która przyjmuje jeden parametr typu int i zwraca sumę z wartości przekazanych do zwykłej funkcji i funkcji lambda.
    *Chciałbym się upewnić czy jest dobrze i co dalej zrobić ?
Kopiuj
#include <iostream>

using namespace std;

int add(int x , int f){return x+f;}

auto f = [](int xx){return xx;};

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
3

Napisz funkcję (zwykłą), która przyjmuje parametr typu int.

Gdzie masz tę funkcję?

enedil
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1028
2

W skrócie, nie masz nic w tym dobrze. W szczególności, żadna z funkcji, które napisałeś nie zwraca funkcji lambda.

S5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 58
0
enedil napisał(a):

W skrócie, nie masz nic w tym dobrze. W szczególności, żadna z funkcji, które napisałeś nie zwraca funkcji lambda.

funkcja::
int add(int x , int f){return x+f;}

S5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 58
1
Patryk27 napisał(a):

Napisz funkcję (zwykłą), która przyjmuje parametr typu int.

Gdzie masz tę funkcję?
Funkcja::
int add(int x , int f){return x+f;}

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5023
enedil
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1028
2
sssebastianb5 napisał(a):
enedil napisał(a):

W skrócie, nie masz nic w tym dobrze. W szczególności, żadna z funkcji, które napisałeś nie zwraca funkcji lambda.

funkcja::
int add(int x , int f){return x+f;}

No nie zwraca funkcji lambda, zwraca sumę liczb, a nie funkcję.

S5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 58
0
enedil napisał(a):
sssebastianb5 napisał(a):
enedil napisał(a):

W skrócie, nie masz nic w tym dobrze. W szczególności, żadna z funkcji, które napisałeś nie zwraca funkcji lambda.

funkcja::
int add(int x , int f){return x+f;}

No nie zwraca funkcji lambda, zwraca sumę liczb, a nie funkcję.

czyli ,co mam napisać funkcję lambda w następujący sposób ?

Kopiuj
auto l = [] (int x, int y) { return x + y; };

enedil
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1028
1

Nie, dalej nie zwracasz żadnej funkcji lambda, tylko jakąś sumę liczb.

S5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 58
0
Kopiuj
auto add() -> decltype ([](int x) -> int)
{
    return [](int x) { return x; }
}

chodzi może o ten zapis ?

enedil
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1028
1

Coś tego typu, tylko jeszcze pozostaje zgodność z resztą założeń zadania (np. fajnie żeby funkcja add coś dodawała gdzieś).
Możesz również pominąć jawną deklarację typu zwracanego (z pewnością jeśli użyjesz -std=c++2a -fconcepts, nie wiemczy bez tego działa)

S5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 58
0

co powiesz teraz ?

Kopiuj
	auto add() -> decltype ([](int x ,int y) -> int)
{
    return [](int x,int y) { return x+y; };
}
Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
3

A nie chodzi o jakieś:

Kopiuj
auto add(int x){
    auto fun = [x] (int y) { return x + y; };
    return fun;
}

(pewnie trochę zła składnia ale nie umiem w lambdy w c++)
edit: fixed
Masz funkcje add która dla argumentu int zwraca nową funkcje, która dla argumentu int zwraca sumę tych 2 intów.

S5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 58
0

wiesz co ale pokazuje mi jakiś komunikat o błędzie w twoim kodzie

enedil
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1028
0

No to czas na debugowanie, jaki błąd dostajesz?

S5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 58
0

[Error] expected '}' at end of input

Kopiuj
auto add(int x){
    auto fun = [x] (int y) { return x + y; };
    return fun;
}
Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
S5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 58
0
Shalom napisał(a):

@sssebastianb5:

https://ideone.com/JKDDM2

u mnie działa

*mam dalej błąd po skopiowaniu kodu:

,, [Error] 'add' function uses 'auto' type specifier without trailing return type""

ledi12
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
2
Kopiuj
auto first(int x) {
    auto lambda = [x](int y){ return x+y; };
    return lambda;
};

auto func = first(2);
auto lambda = func(6);

cos takiego ?
@Edit

enedil
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1028
1
sssebastianb5 napisał(a):
Shalom napisał(a):

@sssebastianb5:

https://ideone.com/JKDDM2

u mnie działa

*mam dalej błąd po skopiowaniu kodu:

,, [Error] 'add' function uses 'auto' type specifier without trailing return type""

https://stackoverflow.com/questions/44798728/warning-function-uses-auto-type-specifier-without-trailing-return-type

przełącz wersję języka na nowszą, co najmniej c++14

S5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 58
0
enedil napisał(a):
sssebastianb5 napisał(a):
Shalom napisał(a):

@sssebastianb5:

https://ideone.com/JKDDM2

u mnie działa

*mam dalej błąd po skopiowaniu kodu:

,, [Error] 'add' function uses 'auto' type specifier without trailing return type""

https://stackoverflow.com/questions/44798728/warning-function-uses-auto-type-specifier-without-trailing-return-type

przełącz wersję języka na nowszą, co najmniej c++14

*Super wszystko działa wielkie dzięki :)

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5023
2

tak tylko zostawiam:

Kopiuj
# dummy lambda discussion:)

def f(x):
	return lambda y: y + x


print(f(41)) # function bla bla bla
print(f(41)(1)) # 42
LI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 98
1

Jest taka prezentacja "Fun with Lambdas": https://www.slideshare.net/SumantTambe/fun-with-lambdas-c14-style

Krok po kroku pokazuje coraz to bardziej pokręcone lambdy, ta na slajdzie 19 to już prawie-to-o-co-tu-chodzi, bo zapamiętuje parametr, trzeba by tylko dodawanie dołożyć.

TomaszLiMoon
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 530
2

Tutaj przykład zwracanej lambdy w ogólnej formie ( C++17 )

Kopiuj
template< typename ...Arg >
auto sum( Arg&&... args )
{
    return  [ args = std::make_tuple( std::forward<Arg>(args) ... ) ]( auto a )
            {
               return a + std::apply( [](auto&& ... args ){ return (args+...); } , std::move(args) );
            };
}
......
std::cout << sum(41)(1) << std::endl; // = 42
std::cout << sum(1,2,3)(-1) << std::endl; // = 5
std::cout << sum(1.6,-2.1,3)(-0.01) << std::endl; // = 2.49
std::cout << sum('b',-'a')(0) << std::endl; // = 1
std::cout << sum(0.01,'c',-34.6,0.6,8.7)(20.0) << std::endl;  // = 93.71
std::cout << sum(" is"s, " my"s, " name"s)("This"s) << std::endl; // = "This is my name"
Spearhead
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1007
1

A ja wysmażyłem coś takiego (fold expressions for the win):

Kopiuj
#include <iostream>

auto sum() {
    return []<typename ...Args>(Args&&... args){return (args + ...);};
}

int main()  {
    std::cout << sum()(1, 2, 3, 4) << std::endl;
}
Kopiuj
$ g++ test.cpp -o test -std=c++17
$ ./test 
10

Z parametrem to

Kopiuj
#include <iostream>

template <class T>
auto sum(T i) {
    return [i]<typename ...Args>(Args&&... args){return (args + ... + i);};
}

int main()  {
    std::cout << sum(10)(1, 2, 3, 4) << std::endl;
}
Kopiuj
$ g++ test.cpp -o test -std=c++17
$ ./test 
20

Albo na całego:

Kopiuj
#include <iostream>

template <class ...T>
auto sum(T&&... t) {
    return [t...]<typename ...Args>(Args&&... args){return (args + ... + (t + ...));};
}

int main()  {
    std::cout << sum(10, 10, 10)(1, 2, 3, 4) << std::endl;
}
Kopiuj
$ g++ test.cpp -o test -std=c++17
$ ./test 
40

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.