Изучай Haskell ради Добра! Синтаксис функций

Miran Lipovača, “Learn you a Haskell for Great Good:chapter - Syntax in Functions”, public translation into Russian from English More about this translation.

See also 26 similar translations

Translate into another language.

Participants

asinitsyn3069 points
JEuler1878 points
SmirnovskySaha260 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 next untranslated
1 2 3 4 5 6 7 8 9 10 11 12 13

Learn you a Haskell for Great Good:chapter - Syntax in Functions

Изучай Haskell ради Добра! Синтаксис функций

History of edits (Latest: Dmitry-Leushin 2 years, 3 months ago) §

— Т.к. хабр-сообщество не высказало ярого отвращения к текущему названию, пока оставим так. Возможно, в концу перевода при оформлении книги в целом изменим на другой вариант. Dmitry-Leushin

Syntax in Functions

Синтаксис функций

History of edits (Latest: Dmitry-Leushin 2 years, 3 months ago) §

Pattern matching

Сопоставление с образцом

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

Comment was deleted

Comment was deleted

This chapter will cover some of Haskell's cool syntactic constructs and we'll start with pattern matching. Pattern matching consists of specifying patterns to which some data should conform and then checking to see if it does and deconstructing the data according to those patterns.

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

History of edits (Latest: SmirnovskySaha 2 years, 1 month ago) §

Comment was deleted

— "Во время выполнения" - не очень хорошо. Во время выполнения программы? Но у нас же ФП=) У автора все-таки этого нет, следует переписать (но пока не соображу, как) SmirnovskySaha

— У ФП программ так же есть время выполнения, в чем противоречие? Я разбил предложение автора на три русских, для того чтобы не писать огромное сложноподчиненное предложение. asinitsyn

— Добавил "Во время выполнения программы", дыбы было понятней SmirnovskySaha

— Есть вариант - "Во время исполнения программы" Dmitry-Leushin

When defining functions, you can define separate function bodies for different patterns. This leads to really neat code that's simple and readable. You can pattern match on any data type — numbers, characters, lists, tuples, etc. Let's make a really trivial function that checks if the number we supplied to it is a seven or not.

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

History of edits (Latest: Dmitry-Leushin 2 years, 2 months ago) §

lucky :: (Integral a) => a -> String

lucky :: (Integral a) => a -> String

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

lucky 7 = "LUCKY NUMBER SEVEN!"

lucky 7 = "LUCKY NUMBER SEVEN!"

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

— Может, стотт перевести здесь? (Как сделано в этой же главе далее) SmirnovskySaha

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

— Так я и говорю про комментарий - добавить в комментарий перевод на русский SmirnovskySaha

— Против перевода, увидеть "\1057\1095\1072\1089\1090\1083\1080\1074\1099\1081 \1085\1086\1084\1077\1088 \1089\1077\1084\1100!" Вместо русского текста "Счастливый номер семь!" не очень приятно. А добавление комментария мало чего даст. alexvrud

lucky x = "Sorry, you're out of luck, pal!"

lucky x = "Sorry, you're out of luck, pal!"

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

When you call lucky, the patterns will be checked from top to bottom and when it conforms to a pattern, the corresponding function body will be used. The only way a number can conform to the first pattern here is if it is 7. If it's not, it falls through to the second pattern, which matches anything and binds it to x.

Когда вы вызываете функцию lucky, происходит проверка параметра на совпадение с заданными шаблонами, в том порядке как они были заданы. Когда проверка даст положительный результат - используется соответствующее тело функции. Единственный случай, когда число переданное функции удовлетворяет первому шаблону - когда оно равно семи. Если нет, то происходит проверка на совпадение со следующим шаблоном. Следующий шаблон может быть успешно сопоставлен с любым числом, также он привязывает переданное число к переменной x.

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

This function could have also been implemented by using an if statement. But what if we wanted a function that says the numbers from 1 to 5 and says "Not between 1 and 5" for any other number? Without pattern matching, we'd have to make a pretty convoluted if then else tree. However, with it:

Эта функция может быть реализована с использованием оператора if. Но что если нам потребуется написать функцию, которая называет цифры от 1 до 5, и выводит "Not between 1 and 5" для других чисел? Без сопоставления с образцом нам бы пришлось создать очень запутанное дерево выражений if then else. А вот что получится, если использовать сопоставление:

History of edits (Latest: alexvrud 1 year, 3 months ago) §

— "Однако, с сопоставлением с шаблоном:" как-то фраза обрывается и слишком много "с". Можно "А вот что получится, если использовать сопоставление:" SmirnovskySaha

sayMe :: (Integral a) => a -> String

sayMe :: (Integral a) => a -> String

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

sayMe 1 = "One!"

sayMe 1 = "One!"

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

sayMe 2 = "Two!"

sayMe 2 = "Two!"

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

sayMe 3 = "Three!"

sayMe 3 = "Three!"

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

sayMe 4 = "Four!"

sayMe 4 = "Four!"

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

sayMe 5 = "Five!"

sayMe 5 = "Five!"

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

sayMe x = "Not between 1 and 5"

sayMe x = "Not between 1 and 5"

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

Note that if we moved the last pattern (the catch-all one) to the top, it would always say "Not between 1 and 5", because it would catch all the numbers and they wouldn't have a chance to fall through and be checked for any other patterns.

Заметьте, что если бы мы переместили последний шаблон (который соответствует любому вводу) вверх, то функция всегда бы выводила "Not between 1 and 5", потому что этот шаблон подходит для любого числа, и невозможно было бы пройти дальше и сделать проверку на совпадение с другими шаблонами.

History of edits (Latest: Dmitry-Leushin 2 years, 2 months ago) §

Remember the factorial function we implemented previously? We defined the factorial of a number n as product [1..n]. We can also define a factorial function recursively, the way it is usually defined in mathematics. We start by saying that the factorial of 0 is 1.

Помните реализованную нами функцию факториала? Мы определили факториал числа n как произведение чисел [1..n]. Мы можем определить данную функцию рекурсивно, точно так же, как факториал определяется в математике. Начнем с того, что объявим факториал нуля равным единице.

History of edits (Latest: Dmitry-Leushin 2 years, 2 months ago) §

— Более русское звучание lazil

Pages: ← previous Ctrl next next untranslated
1 2 3 4 5 6 7 8 9 10 11 12 13

License: Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License