Ru/IO

From HaskellWiki
< Ru
Revision as of 09:16, 10 September 2007 by Bulatz (talk | contribs)

Jump to: navigation, search

В императивных языках вроде C++ нет разделения функций на чистые и имеющие побочные эффекты, любая функция рассматривается как потенциально "грязная". С одной стороны, это облегчает модификацию программы (любая чисто вычислительная функция может быть переделана в имеющую побочные эффекты), с другой стороны - усложняет понимание программы, её отладку и модификацию - какая-нибудь скромная функция sin может bvtnm совершенно нескромные побочные эффекты ;)

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

Вычисления внутри функций производятся по мере необходимости и в том порядке, в каком в них возникает необходимость. В отличие от этого процедура описывает последовательность операций, которые выполняются обязательно и обязательно в указанном порядке. Поэтому способ записи, применяемый для определения функций, не годится для процедур, и для них используется специальная do-нотация, сходная с императивными языками

Главная выполняемая функция в хаскеле - main - является процедурой, и на ней мы рассмотрим примеры описания процедур:

Простейшая процедура, выполняющая два действия. Как мы уже говорили, они выполняются строго в заданном порядке:

main = do print "Hello, World!"
          print "Haskell rules, C++ sucks!"

"Действия", выполнямые в do - это в свою очередь вызовы других процедур. Мы можем присваивать "переменным" значения, возвращаемые из этих процедур, и организовывать условное выполнение:

main = do print "Hey, kid, what is your name?"
          name <- getLine
          if name=="Bulat"
            then do print "Thank you, Creator"
            else do print ("Hi, "++name)

Для организации циклов, как обычно, используется рекурсия. Возвратить значение из порцедуры можно с помощью "return". Опишем процедуру, которая вводит непустую строку:

myGetLine = do str <- getLine
               if str==""
                 then do print "Пожалуйств, введите непустую строку"
                         myGetLine
                 else return str

и пример её применения:

main = do print "Hey, kid, what is your name?"
          name <- myGetLine
          if name=="Bulat"
            then do print "Thank you, Creator"
            else do print ("Hi, "++name)