Что такое лямбда (функция)?

Ваша активность, вероятно, уничтожается и воссоздается при отключении активности камеры. Возможно, попробуйте сохранить фотопат в Bundle в onSaveInstanceState, а затем вытащите его обратно в onCreate (убедитесь, что вы проверяете нули в onCreate, когда вы это делаете)?

693
задан nawfal 4 July 2014 в 06:04
поделиться

12 ответов

Лямбда прибывает из Лямбда-исчисление и обращается к анонимным функциям в программировании.

, Почему это прохладно? Это позволяет Вам писать, что быстрый бросок далеко функционирует, не называя их. Это также обеспечивает хороший способ записать закрытия. С тем питанием можно сделать вещи как это.

Python

def adder(x):
    return lambda y: x + y
add5 = adder(5)
add5(1)
6

, Как Вы видите от отрывка Python, функциональный сумматор, берет в аргументе x и возвращает анонимную функцию или лямбду, которая берет другой аргумент y. Та анонимная функция позволяет Вам создавать функции из функций. Это - простой пример, но он должен передать лямбды питания, и закрытия имеют.

Примеры на других языках

Perl 5

sub adder {
    my ($x) = @_;
    return sub {
        my ($y) = @_;
        $x + $y
    }
}

my $add5 = adder(5);
print &$add5(1) == 6 ? "ok\n" : "not ok\n";

JavaScript

var adder = function (x) {
    return function (y) {
        return x + y;
    };
};
add5 = adder(5);
add5(1) == 6

JavaScript (ES6)

const adder = x => y => x + y;
add5 = adder(5);
add5(1) == 6

схема

(define adder
    (lambda (x)
        (lambda (y)
           (+ x y))))
(define add5
    (adder 5))
(add5 1)
6

C# 3.5 или выше

Func<int, Func<int, int>> adder = 
    (int x) => (int y) => x + y; // `int` declarations optional
Func<int, int> add5 = adder(5);
var add6 = adder(6); // Using implicit typing
Debug.Assert(add5(1) == 6);
Debug.Assert(add6(-1) == 5);

// Closure example
int yEnclosed = 1;
Func<int, int> addWithClosure = 
    (x) => x + yEnclosed;
Debug.Assert(addWithClosure(2) == 3);

Swift

func adder(x: Int) -> (Int) -> Int{
   return { y in x + y }
}
let add5 = adder(5)
add5(1)
6

PHP

$a = 1;
$b = 2;

$lambda = function () use (&$a, &$b) {
    echo $a + $b;
};

echo $lambda();

Haskell

(\x y -> x + y) 

Java видит это сообщение

// The following is an example of Predicate : 
// a functional interface that takes an argument 
// and returns a boolean primitive type.

Predicate<Integer> pred = x -> x % 2 == 0; // Tests if the parameter is even.
boolean result = pred.test(4); // true

, Lua

adder = function(x)
    return function(y)
        return x + y
    end
end
add5 = adder(5)
add5(1) == 6        -- true

Kotlin

val pred = { x: Int -> x % 2 == 0 }
val result = pred(4) // true

Ruby

Ruby немного отличается в этом, Вы не можете назвать лямбду с помощью того же самого синтаксиса в качестве вызывания функции, но это все еще имеет лямбды.

def adder(x)
  lambda { |y| x + y }
end
add5 = adder(5)
add5[1] == 6

Ruby, являющийся Ruby, существует стенография для лямбд, таким образом, можно определить adder этот путь:

def adder(x)
  -> y { x + y }
end
1023
ответ дан vlad_tepesch 4 July 2014 в 06:04
поделиться

Это - функция, которая не имеет никакого имени. Для, например, в c# можно использовать

numberCollection.GetMatchingItems<int>(number => number > 5);

для возврата чисел, которые больше, чем 5.

number => number > 5

часть лямбды здесь. Это представляет функцию, которая берет параметр (число) и возвращает булево значение (число> 5). Метод GetMatchingItems использует эту лямбду на всех объектах в наборе и возвращает объекты соответствия.

2
ответ дан Serhat Ozgel 4 July 2014 в 06:04
поделиться

Я испытываю затруднения при обертывании моей головы вокруг лямбда-выражений, потому что я работаю в Visual FoxPro, который имеет Макроподстановку и ExecScript {}, и Оцените () функции, которые, кажется, служат почти такой же цели.

? Calculator(10, 23, "a + b")
? Calculator(10, 23, "a - b");

FUNCTION Calculator(a, b, op)
RETURN Evaluate(op)

Одно определенное преимущество для использования формальных лямбд (я принимаю), время компиляции, проверяя: Fox не будет знать, если Вы опечатка текстовая строка выше, пока это не попытается выполнить его.

Это также полезно для управляемого данными кода: можно сохранить все стандартные программы в полях записки в базе данных и затем просто оценить их во времени выполнения. Это позволяет Вам настроить часть приложения, на самом деле не имея доступа к источнику. (Но это - другая тема в целом.)

3
ответ дан SarekOfVulcan 4 July 2014 в 06:04
поделиться

Пример лямбды в Ruby следующие:

hello = lambda do
    puts('Hello')
    puts('I am inside a proc')
end

hello.call

Будет genereate следующий вывод:

Hello
I am inside a proc
7
ответ дан CodingWithoutComments 4 July 2014 в 06:04
поделиться

Мне нравится объяснение Лямбд в этой статье: Эволюция LINQ И Его Влияние На Дизайн C#. Это имело много смысла мне, поскольку это показывает реальный мир для Лямбд и пристраивает его как практический пример.

Их быстрое объяснение: Лямбды являются способом рассматривать код (функции) как данные.

7
ответ дан Jon Galloway 4 July 2014 в 06:04
поделиться

@Brian я использую лямбды все время в C# в LINQ и non-LINQ операторах. Пример:

string[] GetCustomerNames(IEnumerable<Customer> customers)
 { return customers.Select(c=>c.Name);
 }

Перед C#, я использовал анонимные функции в JavaScript для обратных вызовов к функциям Ajax, прежде чем термин Ajax был даже введен:

getXmlFromServer(function(result) {/*success*/}, function(error){/*fail*/});

интересная вещь с синтаксисом лямбды C#, тем не менее, состоит в том, что самостоятельно их тип не может быть выведен (т.е. Вы не можете ввести нечто var = (x, y) => x * y), но в зависимости от которого типа им присваивают, они будут скомпилированы как делегаты или абстрактные синтаксические деревья, представляющие выражение (который является, как картопостроители объекта LINQ делают свое "интегрированное языком" волшебство).

Лямбды в LISP могут также быть переданы оператору цитаты и затем пересечены как список списков. Некоторые мощные макросы пробиты.

5
ответ дан Mark Cidade 4 July 2014 в 06:04
поделиться

Немного упрощенный: функция лямбды является той, которая может быть передана по кругу к другим функциям, и это - логика, к которой получают доступ.

В синтаксисе лямбды C# часто компилируется в простые методы таким же образом как анонимные делегаты, но он может также быть сломан и его логическое чтение.

, Например (в C#3):

LinqToSqlContext.Where( 
    row => row.FieldName > 15 );

LinqToSql может считать ту функцию (x> 15) и преобразовывать его в фактический SQL для выполнения деревьев выражений использования.

оператор выше становится:

select ... from [tablename] 
where [FieldName] > 15      --this line was 'read' from the lambda function

Это отличается от нормальных методов или анонимных делегатов (которые являются просто волшебством компилятора действительно), потому что они не могут быть , читает .

Не все методы в C#, которые используют синтаксис лямбды, могут быть скомпилированы в деревья выражений (т.е. фактические функции лямбды). Например:

LinqToSqlContext.Where( 
    row => SomeComplexCheck( row.FieldName ) );

Теперь дерево выражений не может быть считано - SomeComplexCheck не может быть сломан. SQL-оператор выполнится без, где, и каждая строка в данных будет проведен до SomeComplexCheck.

функции Лямбды не должны быть перепутаны с анонимными методами. Например:

LinqToSqlContext.Where( 
    delegate ( DataRow row ) { 
        return row.FieldName > 15; 
    } );

Это также имеет 'встроенную' функцию, но на этот раз это - просто волшебство компилятора - компилятор C# разделит это к новому методу экземпляра с автоматически сгенерированным именем.

Анонимные методы не могут быть прочитаны, и таким образом, логика не может быть переведена, как она может для функций лямбды.

14
ответ дан Keith 4 July 2014 в 06:04
поделиться

Имя "лямбда" является просто историческим артефактом. Все, о чем мы говорим, является выражением, значение которого является функцией.

А простой пример (использующий Scala для следующей строки):

args.foreach(arg => println(arg))

, где аргумент foreach метод является выражением для анонимной функции. Вышеупомянутая строка является более или менее тем же как записью чего-то вроде этого (не совсем реальный код, но Вы получите идею):

void printThat(Object that) {
  println(that)
}
...
args.foreach(printThat)

за исключением того, что Вы не должны беспокоиться:

  1. Объявление функции где-то в другом месте (и необходимость искать его, когда Вы пересматриваете код позже).
  2. Именование чего-то, что Вы только используете однажды.

, Как только Вы привыкли к значениям функции, имея необходимость обойтись без них, кажется столь же глупым как имя обязанности каждое выражение, такое как:

int tempVar = 2 * a + b
...
println(tempVar)

вместо того, чтобы просто писать выражение, где Вам нужен он:

println(2 * a + b)

точная нотация варьируется от языка до языка; греческий язык не всегда требуется!;-)

56
ответ дан joel.neely 4 July 2014 в 06:04
поделиться

Это относится к лямбда-исчисление , который является формальной системой, которая просто имеет лямбда-выражения, которые представляют функцию, которая берет функцию для собственного аргумента и возвращает функцию. Все функции в лямбда-исчислении имеют тот тип, т.е. λ : λ → λ.

Lisp использовал понятие лямбды для именования его литералов анонимной функции. Эта лямбда представляет функцию, которая берет два аргумента, X и Y, и возвращает их продукт:

(lambda (x y) (* x y)) 

Это может быть применено встроенное как это (оценивает к 50 ):

((lambda (x y) (* x y)) 5 10)
60
ответ дан TylerH 4 July 2014 в 06:04
поделиться

Можно думать о нем как об анонимной функции - вот еще некоторая информация: Википедия - Анонимная функция

4
ответ дан mercutio 4 July 2014 в 06:04
поделиться

Лямбда является типом функции, определенной встроенный. Наряду с лямбдой у Вас также обычно есть некоторый тип переменной, который может содержать ссылку на функцию, лямбду или иначе.

, Например, вот часть C# кода, который не использует лямбду:

public Int32 Add(Int32 a, Int32 b)
{
    return a + b;
}

public Int32 Sub(Int32 a, Int32 b)
{
    return a - b;
}

public delegate Int32 Op(Int32 a, Int32 b);

public void Calculator(Int32 a, Int32 b, Op op)
{
    Console.WriteLine("Calculator: op(" + a + ", " + b + ") = " + op(a, b));
}

public void Test()
{
    Calculator(10, 23, Add);
    Calculator(10, 23, Sub);
}

Это называет Калькулятор, проводя не всего два числа, но и который метод назвать внутренний Калькулятор для получения результатов вычисления.

В C# 2.0 мы получили анонимные методы, который сокращает вышеупомянутый код к:

public delegate Int32 Op(Int32 a, Int32 b);

public void Calculator(Int32 a, Int32 b, Op op)
{
    Console.WriteLine("Calculator: op(" + a + ", " + b + ") = " + op(a, b));
}

public void Test()
{
    Calculator(10, 23, delegate(Int32 a, Int32 b)
    {
        return a + b;
    });
    Calculator(10, 23, delegate(Int32 a, Int32 b)
    {
        return a - b;
    });
}

И затем в C# 3.0 мы получили лямбды, который делает код еще короче:

public delegate Int32 Op(Int32 a, Int32 b);

public void Calculator(Int32 a, Int32 b, Op op)
{
    Console.WriteLine("Calculator: op(" + a + ", " + b + ") = " + op(a, b));
}

public void Test()
{
    Calculator(10, 23, (a, b) => a + b);
    Calculator(10, 23, (a, b) => a - b);
}
101
ответ дан kevinji 4 July 2014 в 06:04
поделиться

В Javascript, например, функции обрабатываются как тот же смешанный тип, что и все остальное ( int , string , float ], bool ). Таким образом, вы можете создавать функции на лету, назначать их объектам и вызывать их позже. Это полезно, но не то, чем вы хотите злоупотреблять, иначе вы запутаете всех, кто должен поддерживать ваш код после того, как вы ...

Это код, с которым я играл, чтобы увидеть, насколько глубока эта кроличья нора:

var x = new Object;
x.thingy = new Array();
x.thingy[0] = function(){ return function(){ return function(){ alert('index 0 pressed'); }; }; }
x.thingy[1] = function(){ return function(){ return function(){ alert('index 1 pressed'); }; }; }
x.thingy[2] = function(){ return function(){ return function(){ alert('index 2 pressed'); }; }; }

for(var i=0 ;i<3; i++)
    x.thingy[i]()()();
2
ответ дан 22 November 2019 в 21:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: