52700.fb2 Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 138

Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 138

Мы сначала вызываем функцию getChar удваиваем результат функцией \c -> c:c:[] и затем выводим

на экран.

Во втором примере мы дважды запрашиваем символ с клавиатуры а затем печатаем их:

Prelude Control.Applicative> let res = liftA2 (\a b -> a:b:[]) getChar getChar >>= print

Prelude Control.Applicative> res

qw”qw”

8.3 Как пишутся программы

Мы уже умеем читать с клавиатуры и выводить значения на экран. Давайте научимся писать самостоя-

тельные программы. Программа обозначается специальным именем:

main :: IO ()

Если модуль называется Main или в нём нет директивы module ... where и в модуле есть функция main

:: IO (), то после компиляции будет сделан исполняемый файл. Его можно запускать независимо от ghci.

Просто нажимаем дважды мышкой или вызываем из командной строки.

Напишем программу Hello world. Единственное, что она делает это выводит на экран приветствие:

main :: IO ()

main = print ”Hello World!”

Теперь сохраним эти строчки в файле Hello. hs, перейдём в директорию файла и скомпилируем файл:

ghc --make Hello

Появились объектный и интерфейсный файлы, а также появился третий бинарный файл. Это либо Hello

без расширения (в Linux) или Hello. exe (в Windows). Запустим этот файл:

$ ./Hello

”Hello World!”

Получилось! Это наша первая программа. Теперь напишем программу, которая принимает три символа

с клавиатуры и выводит их в обратном порядке:

import Control.Applicative

f :: Char -> Char -> Char -> String

f a b c = reverse $ [a,b,c]

main :: IO ()

main = print =<< f <$> getChar <*> getChar <*> getChar

Сохраним в файле ReverseIO. hs и скомпилируем:

ghc --make ReverseIO -o rev3

Дополнительным флагом -o мы попросили компилятор чтобы он сохранил исполняемый файл под име-

нем rev3. Теперь запустим в командной строке:

$ ./rev3

qwe

”ewq”

Как пишутся программы | 129

Набираем три символа и нажимаем ввод. И программа переворачивает ответ. Обратите внимание на то,

что с помощью print мы выводим не просто строку на экран, а строку как значение. Поэтому добавляются

двойные кавычки. Для того чтобы выводить строку существует функция putStr. Заменим print на putStr,

перекомпилируем и посмотрим что получится:

$ ghc --make ReverseIOstr -o rev3str

[1 of 1] Compiling Main

( ReverseIOstr.hs, ReverseIOstr.o )

Linking rev3str ...

$ ./rev3str

123

321$

Видно, что после вывода не произошёл перенос каретки, терминал приглашает нас к вводу команды сразу

за ответом, если перенос нужен, можно воспользоваться функцией putStrLn. Обратите внимание на то, что