Ru/IO

From HaskellWiki
< Ru
Revision as of 09:06, 10 September 2007 by Bulatz (talk | contribs)
Jump to navigation Jump to search

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

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

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

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

Простейшая процедура, выполняющая два действия. Как мы уже говорили, они выполняются строго в заданном порядке: main = do print "Hello, World!"

         print "Haskell rules, C++ sucks!"

Более сложная процедура, демонстрирующая присвоение "переменной" значения, возращённого другой процедурой, и улсовное выполнение:

main = do print "Hey, kid, what is your name?"

         name <- getLine
         if name=="Bulat"
           then print "Thank you, Creator"
           else print ("Hi, "++name)