Шаг 27.
Основы языка Haskell. Основные типы данных, операции, способы определения функций. Литературный код на языке Haskell

    На этом шаге мы рассмотрим правила написания литературного кода.

    В языке Haskell литературное программирование выражается в использовании литературного кода, который характеризуется тем, что в текстовом файле записан не исходный код программы, а поясняющий её текст, при этом сама программа определённым образом вставлена в таком файле так, что транслятор языка Haskell "понимает", что это именно код, который надо исполнять или компилировать.

    Человек, только начинающий программировать, думает в первую очередь об исходном коде, а во вторую - о комментариях к нему.

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

    Большинство трансляторов языка Haskell поддерживают два типа литературных кодов. При любом из этих двух подходов файл, в котором хранится программа в литературном коде, имел расширение

   .lhs
(вместо расширения .hs, которое обычно используется).

    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}
Файл с примерами можно взять здесь.

    На следующем шаге мы рассмотрим среду разработки.




Предыдущий шаг Содержание Следующий шаг