Scala Карринг и функциональные литералы - PullRequest
0 голосов
/ 17 мая 2018

Я читал the-neophytes-guide-to-scala-part-10 , где я наткнулся на следующий код.

type EmailFilter = Email => Boolean

val minimumSize: Int => EmailFilter = n => email => email.text.size >= n

Я понял первую строку, в которой указан псевдоним EmailFilterсоздан для функции, которая принимает email возвращаемый логический.Но я не понимаю вторую строку, где мы берем электронную почту и номер в качестве ввода и возвращаем логическое значение, проверяя размер.Пожалуйста, расшифруйте вторую строку и объясните мне этот синтаксический сахарный код для функции.

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Функция minimumSize является функцией curry .

Curry - это способ разбить вызов функции на несколько последовательных вызовов подфункций.

У функции карри есть много хороших преимуществ, одно из которых заключается в том, что она позволяет вашей функции быть более компонуемой, откладывая реальный источник данных.

Давайте изобразим использование:

n => email => email.text.size >= n   

Сначала мы можем вызвать эту функцию, передав параметр только для n:

minimumSize(2) // partially applies the minimumSize function with 2 as n 

Вы получите вна этот раз:

val nextFunction = email => email.text.size >= 2

Далее вы позвоните nextFunction с электронной почтой:

nextFunction(Email("anemail@domain.com"))

В этот раз вы получите логическое значение:

val bool = Email("anemail@domain.com").text.size >= 2

Такесли мы подведем итоги:

Мы начали с Int, затем Email, затем Boolean:

Int => Email => Boolean

И, посмотрев на эту подпись более внимательно, выраспознает EmailFilter подпись.
Давайте подставим:

Int => EmailFilter 

Идея состоит в том, чтобы EmailFilter действовал как шаблон , который можно параметризировать с более высокимfunctions.
Здесь мы параметризовали сравнение размера текста электронной почты, чтобы мы могли сохранить универсальный EmailFilter.

Имейте в виду, что функциональное программирование - это создание функций.

0 голосов
/ 17 мая 2018

Синтаксического сахара не существует, есть только лямбда-выражения. Если вы вставите определение type EmailFilter в тип во второй строке, вы получите

Int => (Email => Boolean)

, что совпадает (из-за правой ассоциативности =>) с

Int => Email => Boolean 

и это идеально соответствует

n   => email => (email.text.size >= n)

, который, по сути, просто говорит: с учетом числа n, создайте фильтр электронной почты, который при email возвращает true тогда и только тогда, когда длина сообщения будет по крайней мере n так, например,

minimumSize(100)

возвращает замыкание, которое ведет себя так же, как

email => email.text.size >= 100

т.е. он фильтрует все электронные письма, длина которых больше или равна 100. Таким образом, с соответствующим образом определенными примерами писем shortMail и longMail вы получите:

minimumSize(100)(shortMail) // false
minimumSize(100)(longMail) // true
...