Математическое введение в декларативное программирование. Зюзысов В.М. - 73 стр.

UptoLike

Составители: 

общем случае, Вы должны неатомарные аргументы функции помещать в круглые скобки.
Это справедливо и для аргументов, которые сами являются функциональной аппликацией.
Например,
f g x
- функция
f
имеет аргументы
g
и
x
; на других языках это пишется как
f(g,x). Вместе с тем, f(g x) представляет функцию f с аргументом (g x), или, в обыч-
ной записи, f(g(x)).
Хотя интуитивно, но пример с функцией length
выделяет важный аспект языка
Haskell, который носит название «сопоставление с образцом». Левые стороны уравнений
содержат образцы, в данном случае, []
и
x:xs
. В вызовах функций эти образцы должны
соответствовать фактическим параметрам на довольно интуитивном уровне (
[]
соответ-
ствует только пустому списку, и
x:xs
может быть успешно соответствовать любому спи-
ску, по крайней мере, с одним элементом, причем x
обозначение для первого элемента и
xs
хвост списка). Если сопоставление получается, то правая сторона уравнения оценива-
ется и возвращается как результат вызова. Если сопоставление терпит неудачу, то исполь-
зуется следующее уравнение, и если все уравнения терпят неудачу, то возникает ошибка.
Поскольку Haskell – функциональный язык, нужно ожидать, что функции играют
основную роль, и на самом деле это так. Мы уже познакомились с некоторыми способами
определения функций. Перечислим все способы.
Функции могут быть определены на верхнем уровне программы, как, например:
f x = x*x + 3 -- используя явно аргумент
f = \x -> x * x + 3 -- используя ламбдаабстракцию
Заметим, символ равенства обозначает равенство по определению (это не является ни ди-
структивным присваиванием, ни предикатом равенства).
Определение функции может также иметь форму сопоставления с шаблоном (об-
разцом), или использовать несколько уравнений или логические предохранители.
Функции также могут быть локально определены внутри выражений, используя
let
конструкцию, например:
f x y z = let sq i = i * i
in sq x * sq y * sq z
Локальные определения внутри другого определения также возможны через
where
конструкцию, например:
f x y z = sq x * sq y * sq z where
sq v = v * v
Могут быть введены анонимные функции, используя ламбдавыражение
\x y z -> x * y * z
которое эквивалентно следующему выражению
let h x y z = x*y*z in h
Изучим некоторые аспекты функций в языке Haskell. Сначала, рассмотрим опреде-
ление функции, которая суммирует свои два аргумента:
add :: Integer -> Integer -> Integer
add x y = x + y
73