Изучай Haskell ради Добра! Функции высшего порядка

Miran Lipovača, “Learn You a Haskell for Great Good! Higher order functions”, public translation into Russian from English More about this translation.

See also 132 similar translations

Translate into another language.

Participants

asinitsyn5213 points
JEuler1588 points
Julia690 points
And others...
Join Translated.by to translate! If you already have a Translated.by account, please sign in.
If you do not want to register an account, you can sign in with OpenID.
Pages: ← previous Ctrl next

Learn You a Haskell for Great Good! Higher order functions

Изучай Haskell ради Добра! Функции высшего порядка

History of edits (Latest: asinitsyn 2 years, 2 months ago) §

Learn You a Haskell for Great Good! Higher order functions

Изучай Haskell ради Добра! Функции высшего порядка

History of edits (Latest: asinitsyn 2 years, 2 months ago) §

Higher order functions

Функции высшего порядка

History of edits (Latest: asinitsyn 2 years, 2 months ago) §

Haskell functions can take functions as parameters and return functions as return values. A function that does either of those is called a higher order function. Higher order functions aren't just a part of the Haskell experience, they pretty much are the Haskell experience. It turns out that if you want to define computations by defining what stuff is instead of defining steps that change some state and maybe looping them, higher order functions are indispensable. They're a really powerful way of solving problems and thinking about programs.

Функции в Хаскеле могут принимать другие функции как параметры и возвращать функции в качестве результата. Если некая функция делает что-либо из вышеперечисленного, ее называют функцией высших порядков (ФВП). ФВП не просто значительная часть присущего Хаскелю характера программирования, они по большей части и задают этот характер. Как оказывается, ФВП незаменимы если вы хотите программировать, определяя что вы хотите получить, вместо того чтобы определять последовательность шагов, описывая как это получить. Это очень мощный способ решения задач и размышлений о программах.

History of edits (Latest: asinitsyn 2 years, 3 months ago) §

Curried functions

Каррированные функции

History of edits (Latest: Manul 2 years ago) §

Comment was deleted

Every function in Haskell officially only takes one parameter. So how is it possible that we defined and used several functions that take more than one parameter so far? Well, it's a clever trick! All the functions that accepted several parameters so far have been curried functions. What does that mean? You'll understand it best on an example. Let's take our good friend, the max function. It looks like it takes two parameters and returns the one that's bigger. Doing max 4 5 first creates a function that takes a parameter and returns either 4 or that parameter, depending on which is bigger. Then, 5 is applied to that function and that function produces our desired result. That sounds like a mouthful but it's actually a really cool concept. The following two calls are equivalent:

Каждая функция в Хаскеле официально может иметь только один параметр. Но мы определяли и использовали функции, которые принимали несколько параметров, как так может быть? Да, это хитрый трюк! Все функции, которые принимали несколько параметров, были каррированы. Что это значит? Легче всего объяснить на примере. Возьмем нашего старого друга, функцию max. Похоже что она принимает два параметра и возвращает максимальный из них. Если сделать вызов max 4 5, то вначале будет создана функция, которая принимает один параметр, и возвращает 4 или параметр, смотря что больше. Затем 5 передается в эту функцию, и мы получаем желаемый результат. Выглядит неудобоваримо, но на самом деле это очень крутая концепция. Следующие два вызова эквивалентны:

History of edits (Latest: zanuda 2 years ago) §

Comment was deleted

Comment was deleted

Comment was deleted

Comment was deleted

ghci> max 4 5

ghci> max 4 5

History of edits (Latest: asinitsyn 2 years, 3 months ago) §

5

5

History of edits (Latest: asinitsyn 2 years, 3 months ago) §

ghci> (max 4) 5

ghci> (max 4) 5

History of edits (Latest: asinitsyn 2 years, 3 months ago) §

5

5

History of edits (Latest: asinitsyn 2 years, 3 months ago) §

Putting a space between two things is simply function application. The space is sort of like an operator and it has the highest precedence. Let's examine the type of max. It's max :: (Ord a) => a -> a -> a. That can also be written as max :: (Ord a) => a -> (a -> a). That could be read as: max takes an a and returns (that's the ->) a function that takes an a and returns an a. That's why the return type and the parameters of functions are all simply separated with arrows.

Пробел между двумя частями текста означает применение функции. Пробел это нечто вроде оператора языка, и он имеет наивысший приоритет. Давайте посмотрим на тип функции max.
max :: (Ord a) => a -> a -> a.
Это может быть записано как
max :: (Ord a) => a -> (a -> a)
Прочитать можно так - max принимает параметр типа a и возвращает (->) функцию, которая принимает тип a и возвращает тип a. Вот почему возвращаемый функцией тип и параметры функции просто разделяются стрелками.

History of edits (Latest: asinitsyn 2 years, 3 months ago) §

So how is that beneficial to us? Simply speaking, if we call a function with too few parameters, we get back a partially applied function, meaning a function that takes as many parameters as we left out. Using partial application (calling functions with too few parameters, if you will) is a neat way to create functions on the fly so we can pass them to another function or to seed them with some data.

Ну и чем это выгодно для нас? Проще говоря, если мы вызываем функцию и передаем ей не все параметры, в результате мы получаем новую функцию, результат частичного применения исходной функции. Новая функция принимает столько параметров, сколько мы пропустили при вызове оригинальной функции. Частичное применение (или вызов функции не со всеми параметрами, если хотите) это изящный способ для создания новых функций "на лету", мы можем передать их другой функции или передать им еще какие-нибудь параметры.

History of edits (Latest: VlKhomenko 2 years, 3 months ago) §
Pages: ← previous Ctrl next

© Miran Lipovača. License: creative commons attribution noncommercial blah blah blah ... license