Область видимости декларации where

We use cookies. Read the Privacy and Cookie Policy

Переменные, которые мы определили в секции where нашей функции, видимы только ей самой, так что можно не беспокоиться о том, что мы засоряем пространство имён других функций. Если же нам нужны переменные, доступные в нескольких различных функциях, их следует определить глобально. Привязки в секции where не являются общими для различных образцов данной функции. Предположим, что мы хотим написать функцию, которая принимает на вход имя человека и, если это имя ей знакомо, вежливо его приветствует, а если нет – тоже приветствует, но несколько грубее. Первая попытка может выглядеть примерно так:

greet :: String -> String

greet "Хуан" = niceGreeting ++ " Хуан!"

greet "Фернандо" = niceGreeting ++ " Фернандо!"

greet name = badGreeting ++ " " ++ name

  where niceGreeting = "Привет! Так приятно тебя увидеть,"

        badGreeting = "О, чёрт, это ты,"

Однако эта функция работать не будет, так как имена, введённые в блоке where, видимы только в последнем варианте определения функции. Исправить положение может только глобальное определение функций niceGreeting и badGreeting, например:

badGreeting :: String

badGreeting = "О, чёрт, это ты,"

niceGreeting :: String

niceGreeting = "Привет! Так приятно тебя увидеть,"

greet :: String -> String

greet "Хуан" = niceGreeting ++ " Хуан!"

greet "Фернандо" = niceGreeting ++ " Фернандо!"

greet name = badGreeting ++ " " ++ name