Использование ключевого слова let внутри блока do

We use cookies. Read the Privacy and Cookie Policy

Помните связывания при помощи ключевого слова let? Если уже подзабыли, освежите свои знания. Связывания должны быть такого вида: let <определения> in <выражение>, где <определения> – это имена, даваемые выражениям, а <выражение> использует имена из <определений>. Также мы говорили, что в списковых выражениях часть in не нужна. Так вот, в блоках do можно использовать выражение let таким же образом, как и в списковых выражениях. Смотрите:

import Data.Char

main = do

   putStrLn "Ваше имя?"

   firstName <– getLine

   putStrLn "Ваша фамилия?"

   lastName <– getLine

   let bigFirstName = map toUpper firstName

       bigLastName = map toUpper lastName

   putStrLn $ "Привет, " ++ bigFirstName ++ " "

                         ++ bigLastName

                         ++ ", как дела?"

Видите, как выровнены операторы действий ввода-вывода в блоке do? Обратите внимание и на то, как выровнено выражение let по отношению к действиям ввода-вывода и как выровнены образцы внутри выражения let. Это хороший пример, потому что выравнивание текста очень важно в языке Haskell. Далее мы записали вызов map toUpper firstName, что превратит, например, "Иван" в намного более солидное "ИВАН". Мы связали эту строку в верхнем регистре с именем, которое использовали в дальнейшем при выводе на терминал.

Вам может быть непонятно, когда использовать символ <–, а когда выражение let. Запомните: символ <– (в случае действий ввода-вывода) используется для выполнения действий ввода-вывода и связывания результатов с именами. Выражение map toUpper firstName не является действием ввода-вывода – это чистое выражение. Соответственно, используйте символ <– для связывания результатов действий ввода-вывода с именами, а выражение let – для связывания имён с чистыми значениями. Если бы мы выполнили что-то вроде let firstName = getLine, то просто создали бы синоним функции getLine, для которого значение всё равно должно получаться с помощью символа <–.