Изучай Haskell ради Добра! Функции высшего порядка | Participants
|
- Statistics
- Participants
- Translate into Russian
- Translation result
- Translated in draft, editing and proof-reading required. Completed: 13%.
If you do not want to register an account, you can sign in with OpenID.
Learn You a Haskell for Great Good! Higher order functions | Изучай Haskell ради Добра! Функции высшего порядка | |
Learn You a Haskell for Great Good! Higher order functions | Изучай Haskell ради Добра! Функции высшего порядка | |
Higher order functions | ||
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. | Функции в Хаскеле могут принимать другие функции как параметры и возвращать функции в качестве результата. Если некая функция делает что-либо из вышеперечисленного, ее называют функцией высших порядков (ФВП). ФВП не просто значительная часть присущего Хаскелю характера программирования, они по большей части и задают этот характер. Как оказывается, ФВП незаменимы если вы хотите программировать, определяя что вы хотите получить, вместо того чтобы определять последовательность шагов, описывая как это получить. Это очень мощный способ решения задач и размышлений о программах. | |
Curried functions | ||
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 передается в эту функцию, и мы получаем желаемый результат. Выглядит неудобоваримо, но на самом деле это очень крутая концепция. Следующие два вызова эквивалентны: | Comment was deleted Comment was deleted Comment was deleted Comment was deleted |
ghci> max 4 5 | ||
5 | ||
ghci> (max 4) 5 | ||
5 | ||
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. | |
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. | Ну и чем это выгодно для нас? Проще говоря, если мы вызываем функцию и передаем ей не все параметры, в результате мы получаем новую функцию, результат частичного применения исходной функции. Новая функция принимает столько параметров, сколько мы пропустили при вызове оригинальной функции. Частичное применение (или вызов функции не со всеми параметрами, если хотите) это изящный способ для создания новых функций "на лету", мы можем передать их другой функции или передать им еще какие-нибудь параметры. |
© Miran Lipovača. License: creative commons attribution noncommercial blah blah blah ... license

Comment was deleted