На этом шаге мы рассмотрим правила написания литературного кода.
В языке Haskell литературное программирование выражается в использовании литературного кода, который характеризуется тем, что в текстовом файле записан не исходный код программы, а поясняющий её текст, при этом сама программа определённым образом вставлена в таком файле так, что транслятор языка Haskell "понимает", что это именно код, который надо исполнять или компилировать.
Человек, только начинающий программировать, думает в первую очередь об исходном коде, а во вторую - о комментариях к нему.
Литературный код меняет такой подход: в первую очередь комментарии, а только во вторую - сами программы. Поэтому в литературном коде сам текст комментария записывается обычным образом, а определения программных сущностей выделяются специальным образом.
Большинство трансляторов языка Haskell поддерживают два типа литературных кодов. При любом из этих двух подходов файл, в котором хранится программа в литературном коде, имел расширение
.lhs
1."Птичий язык". В модулях, записанных на "птичьем языке", для выделения значимых для трансляции строк используется символ "больше" (>). При этом принят следующий стиль, который называется литературным стилем Р.Бёрда: пустые строки между обычным текстом и текстом программы, который начинается с символа ">", значимы. При их отсутствии транслятор "не понимает", где начинается значимая часть текста.
Демонстрационные примеры.
Демонстрация использования литературного кода при написании текста программы. ----------------------------------------------------- Функция, возвращающая абсолютное значение аргумента n > absN:: Double -> Double > absN n | n<0 = (-n) > | n>=0 = n Функция, возвращающая абсолютное значение аргумента n, в записи которой используются альтернативы > absN1:: Integer -> Integer > absN1 n = if n<0 > then (-n) > else n Функция, возвращающая наибольшее из двух чисел с исполь- зованием охранных выражений > maxMN:: Double -> Double -> Double > maxMN m n | m>n = m > | m<=n = n Функция, определяющая наименьшее из двух чисел с выводом текстового результата на экран дисплея > maxMN1:: Int -> Int -> String > maxMN1 m n | m<n = "Первое число меньше второго" > | m>n = "Второе число меньше первого" > | True = "Значения равны" --------------------------- Неудачные тестовые примеры: --------------------------- > test = testAbs && testAbs1 && testMax && testMax1 > testAbs = absN 22 == 22 > && absN (-22) == 22 > && absN 0 == 0 > && absN 2222222222222222222 == 2222222222222222222 > && absN (-2222222222222222222) == 2222222222222222222 > && absN 2.222222222222222 == 2.222222222222222 > && absN (-2.222222222222222) == 2.222222222222222 > testAbs1 = absN1 12345 == 12345 > && absN1 (-12345) == 12345 > && absN1 0 == 0 > && absN1 2222222222222222222 == 2222222222222222222 > && absN1 (-2222222222222222222) == 2222222222222222222 > testMax = maxMN 5 4 == 5 > && maxMN (-3) (-1) == -1 > && maxMN 0 0 == 0 > && maxMN 99999999 999999991 == 999999991 > && maxMN 99999999999 999999999991 == 999999999991 > && maxMN (-99999999999) (-999999999991) == -99999999999 > && maxMN 99999999999 999999999991 == 999999999991 > && maxMN (-99999999999) (-999999999991) == -99999999999 > && maxMN 999.99999999 99.9999999991 == 999.99999999 > && maxMN 999.99999999 999.99999999 == 999.99999999 > testMax1 = maxMN1 4 5 == "Первое число меньше второго" > && maxMN1 5 (-12) == "Второе число меньше первого" > && maxMN1 (-5) (-5) == "Значения равны"
Многие трансляторы языка Haskell выводят предупреждающие сообщения, если встретят символ ">" внутри обычного текста.
2. LaTEX-код. Для использования этого вида литературного кода необходимо заключить все интересные для транслятора языка Haskell строки в окружение code; этого достаточно, чтобы транслятор "понимал", где находится исходный код на языке Haskell, и использовал для построения программ именно его.
Демонстрационные примеры.
Демонстрация использования литературного кода при
написании текста программы
--------------------------
\begin{code}
module Main where
main::IO()
main = putStr "Здравствуй, мир!"
\end{code}
На следующем шаге мы рассмотрим среду разработки.