Difference between revisions of "Ru/IO"
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)