Изучай Haskell во имя добра! (Липовача) - страница 123

>Привет, я Энди!

Функция putChar

Функция >putChar принимает символ и возвращает действие ввода-вывода, которое напечатает его на терминале.

>main = do

>   putChar 'A'

>   putChar 'Б'

>   putChar 'В'

Функция >putStr определена рекурсивно с помощью функции >putChar. Базовый случай для функции >putStr – это пустая строка. Если печатаемая строка пуста, функция возвращает пустое действие ввода-вывода, то есть >return (). Если строка не пуста, функция выводит на терминал первый символ этой строки, вызывая функцию >putChar, а затем выводит остальные символы, снова рекурсивно вызывая саму себя.

>putStr :: String –> IO ()

>putStr [] = return ()

>putStr (x:xs) = do

>    putChar x

>    putStr xs

Как вы заметили, мы можем использовать рекурсию в системе ввода-вывода подобно тому, как делаем это в чистом коде. Точно так же образом мы определяем базовые случаи, а затем думаем, что будет результатом. В результате мы получим действие, которое выведет первый символ, а затем остаток строки.

Функция print

Функция >print принимает значение любого типа – экземпляра класса >Show (то есть мы знаем, как представить значение этого типа в виде строки), вызывает функцию >show, чтобы получить из данного значения строку, и затем выводит её на экран. По сути, это >putStrLn.show. Это выражение сначала вызывает функцию >show на переданном параметре, а затем «скармливает» результат функции >putStrLn, которая возвращает действие ввода-вывода; оно, в свою очередь, печатает заданное значение.

>main = do

>   print True

>   print 2

>   print "ха-ха"

>   print 3.2

>   print [3,4,3]

После компиляции и запуска получаем:

>True

>2

>"ха-ха"

>3.2

>[3,4,3]

Как вы могли заметить, это очень полезная функция. Помните, мы говорили о том, что действия ввода-вывода выполняются только из функции >main или когда мы выполняем их в интерпретаторе GHCi? После того как мы напечатаем значение (например, >3 или >[1, 2, 3]) и нажмём клавишу «Ввод», интерпретатор GHCi вызовет функцию >print с введённым значением для вывода на терминал!

>ghci> 3

>3

>ghci> print 3

>3

>ghci> map (++"!") ["хей","хо","ууу"]

>["хей!","хо!","ууу!"]

>ghci> print $ map (++"!") ["хей","хо","ууу"]

>["хей!","хо!","ууу!"]

Как правило, мы хотим видеть строку на экране, не заключённую в кавычки, поэтому для печати строк обычно используется функция >putStrLn. Но для печати значений других типов преимущественно используется функция >print.

Функция when

Функция >when находится в модуле >Control.Monad (чтобы к ней обратиться, воспользуйтесь >import Control.Monad). Она интересна, потому что выглядит как оператор управления ходом вычислений, но на самом деле это обычная функция. Она принимает булевское значение и действие ввода-вывода. Если булевское значение истинно, она возвращает второй параметр – действие ввода-вывода. Если первый параметр ложен, функция возвращает