Лямбда-выражения представляют сокращенную запись функций. Они имеют следующее формальное определение:
fun список_параметров -> действия
Определение лямбда-выражения начинается с ключевого слова fun, за которым следует список параметров. А затем через оператор
->
выполняемые действия.
Например, определим лямбда выражение, которое не использует параметры и просто выводит сообщение на консоль:
let mes = fun _ -> printfn "Hello" // определение лямбда-выражения mes() // вызов лямбда-выражения
Определение параметров лямбда-выражения производится так же как и в обычной функции. А выражение, которое стоит справа от оператора ->
,
представляет результат лямбда-выражения.
Поскольку здесь параметр не важен, то вместо параметра указывается прочерк. Также можно использовать тип unit
:
Лямбда-выражение как и обычную функцию можно передать значению (в данном случае значению mes) и через это значение вызывать.
Другой пример - лямбда-выражение, которое принимает два параметра и возвращает сумму их значений:
let sum = fun x y -> x + y let result = sum 10 4 printfn $"result = {result}" // result = 14
Как и функция, лямбда-выражение может быть многострочным. В этом случае выражения на второй и последующих строках предваряются отступом. А результатом лямбда-выражения служит результат выражения на последней строке:
let sum = fun x y -> printfn $"x: {x}" printfn $"y: {y}" x + y let result = sum 10 4 printfn $"result = {result}" // result = 14
Как правило, лямбда-выражения применяются там, где нам не нужно определено полноценных функций, например, при передаче функций в качестве параметра или их возвращение в качестве результата. Если мы планируем использовать некоторые действия только однократно, но проще определить лямбда-выражение. Например, при передаче параметра:
let operation x y func = func x y let result1 = operation 10 6 (fun x y -> x+y) // 16 printfn $"result1 = {result1}" // result1 = 16 let result2 = operation 10 6 (fun x y -> x-y) // 4 printfn $"result2 = {result2}" // result2 = 4
Другой распространенной сферой, где применяются лямбда-выражения - это возвращение функции из функции. Например, в зависимости от некоторого параметра нам надо получить определенное действие:
let operation n = if n = 1 then fun x y -> x + y elif n = 2 then fun x y -> x - y elif n = 3 then fun x y -> x * y else fun x y -> 0 let selection = operation 1 let result1 = selection 10 7 // 17 printfn $"result1 = {result1}" // result1 = 17 let result2 = operation 2 10 7 // 3 printfn $"result2 = {result2}" // result2 = 3