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

    На этом шаге мы рассмотрим этот способ задания функций.

Определение [1, с.120,121].
(1) Клоз (от англ. clause) - это запись варианта вычисления функции, зависящая от вида образцов, записанных правее имени функции:
  <Имя_функции> [Образец1 Образец2 ... Образецn] = <Выражение>
Количество образцов равно количеству аргументов определяемой функции.
(2) Образец (от англ. pattern - калька) - это выражение, построенное с помощью операций конструирования данных, которое используется в определениях функций для сопоставления с данными.
(3) Пустой образец _ (символ подчёркивания) - это образец, значение которого не используется при вычислении выражения.

Примеры образцов.
   5, x, x+4, _.

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


Примеры.
  1. Выражение
      (1+x)
    
    является образцом, поскольку при сопоставлении его, например, с константой 5, "означивание" (присваивание значения) переменной x будет происходить единственным образом (x=4).

  2. Выражение
      (x+y)
    
    образцом быть не может, поскольку "означить" переменные x и y при сопоставлении с константой можно различными способами.
 
Определение.
Определением функции в языке Haskell называется последовательность клозов (возможно, состоящая из одного элемента), каждый из которых пишется на отдельной строке.

    Демонстрационные примеры.

   -- Демонстрация синтаксиса и семантики определения функции
   -- с помощью сопоставления с образцом
   -------------------------------------------------
   -- Функция, увеличивающая значение аргумента на 1
   -------------------------------------------------
   inc:: Int -> Int 
   inc n = n+1                       -- Клоз, n - образец
   ------------------------------------------------------
   -- Функция, уменьшающая значение аргумента на 1
   -----------------------------------------------
   dec:: Int -> Int
   dec n = n-1                       -- Клоз, n - образец
   ------------------------------------------------------
   -- Функция, вычисляющая сумму двух чисел
   -- (тип функции определяется из контекста)
   ------------------------------------------
   add x y = x+y                     -- Клоз, x,y - образец
   --------------------------------------------------------
   -- Предикат, определяющий равенство трёх целых чисел
   ----------------------------------------------------
   eq:: Int -> Int -> Int -> Bool
   eq a b c = (a==b)&&(b==c)      -- Клоз, a,b,c - образцы
   -------------------------------------------------------
   -- Неудачные тестовые примеры:
   ----------------------------------------------
   test1 = inc 5==6 && inc 0==1 && inc (-1)==0 &&
           inc (-5)==(-4) && inc (-599999999)==(-599999998)
   --------------------------------------------------------
   test2 = dec 100==99 && dec 0==(-1) &&
           dec (-1)==(-2) && dec (-5)==(-6) &&
           dec 1234567890==1234567889
   ------------------------------------------------
   test3 = abs (1.23456789-1.0-0.23456789)<0.000001
   ------------------------------------------------
   test4 =   add 1 1 == 2
          && add 0 0 == 0
          && add (-1) (-4) == (-5)
          && add 111111111111 222222222222  == 333333333333
          && add 11.1111111111 2.2222222222 == 13.3333333333
   ---------------------------------------------------------
   test5 =   eq (-876) (-876) (-876) 
          && eq 12345 12345 12345
          && eq 0 0 0
          && eq (inc 0) (dec 2) (add (-3) 4)
          && not (eq 12345 1234 12345)
          && not (eq (-123) 1234 (-45))
Файл с примерами можно взять здесь.
(1)Душкин Р.В. Функциональное программирование на языке Haskell. - М.: ДМК Пресс, 2007. - 608 с.

    На следующем шаге мы рассмотрим операции, определяемые программистом.




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