Difference between revisions of "Ru/IO"

From HaskellWiki
< Ru
Jump to navigation Jump to search
Line 8: Line 8:
   
 
Простейшая процедура, выполняющая два действия. Как мы уже говорили, они выполняются строго в заданном порядке:
 
Простейшая процедура, выполняющая два действия. Как мы уже говорили, они выполняются строго в заданном порядке:
  +
<haskell>
 
main = do print "Hello, World!"
 
main = do print "Hello, World!"
 
print "Haskell rules, C++ sucks!"
 
print "Haskell rules, C++ sucks!"
  +
</haskell>
   
  +
"Действия", выполнямые в do - это в свою очередь вызовы других процедур. Мы можем присваивать "переменным" значения, возвращаемые из этих процедур, и организовывать условное выполнение:
Более сложная процедура, демонстрирующая присвоение "переменной" значения, возращённого другой процедурой, и улсовное выполнение:
 
  +
<haskell>
 
 
main = do print "Hey, kid, what is your name?"
 
main = do print "Hey, kid, what is your name?"
 
name <- getLine
 
name <- getLine
 
if name=="Bulat"
 
if name=="Bulat"
then print "Thank you, Creator"
+
then do print "Thank you, Creator"
else print ("Hi, "++name)
+
else do print ("Hi, "++name)
  +
</haskell>
  +
  +
Для организации циклов, как обычно, используется рекурсия. Возвратить значение из порцедуры можно с помощью "return". Опишем процедуру, которая вводит непустую строку:
  +
<haskell>
  +
myGetLine = do str <- getLine
  +
if str==""
  +
then do print "Пожалуйств, введите непустую строку"
  +
myGetLine
  +
else return str
  +
</haskell>
  +
  +
и пример её применения:
  +
<haskell>
  +
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)
  +
</haskell>

Revision as of 09:16, 10 September 2007

В императивных языках вроде 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)