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