- •Лабораторная работа №3 «программирование пользовательских функций»
- •Общие положения
- •Типы функций
- •Карринг и кортежи (tuples)
- •Префиксная и инфиксная запись
- •Переменные
- •Конструкции let и where
- •Условные выражения
- •Операция выбора и правила выравнивания
- •Сопоставление с образцом
- •Безразличные аргументы
- •Охраняемые образцы (образцы с условиями)
- •Функции высших порядков
- •Примеры функций
- •Лабораторная работа №4
Лабораторная работа №3 «программирование пользовательских функций»
Цель лабораторной работы: ознакомиться с синтаксисом функций в Haskell. Выполнить индивидуальные задания и составить отчёт со скриншотами программы.
Ход работы:
Поскольку функциональное программирование – это «программирование с помощью функций», неудивительно, что в функциональном языке функциям уделяется пристальное внимание. Это приводит к многообразию способов представления и использования функций.
Вы можете сделать множество полезных действий, пользуясь только типами и операциями библиотеки Prelude.hs, но часто необходимо определить новые типы и операции. Это можно осуществить, сохранив их в модулях, которые могут быть загружены и использованы Hugs в дальнейшем.
Модуль представляет собой набор хранимых в файле определений.
Например, модуль для вычисления факториала будет иметь следующий вид:
module Fact where
fact :: Integer -> Integer
fact n = product [1..n]
Этот модуль сохраняется в текстовом редакторе под именем Fact.hs. Все модули, имеющие отношение к Hugs, сохраняются с расширением .hs.
Математически, факториал вычисляется по формуле n! = 1 * 2 * ... * (n-1) * n.
Использованная в данном примере функция product, определенная в Prelude, применяется для вычисления произведений всех чисел от 1 до N в среде Hugs.
Прежде, чем использовать определение Fact в среде Hugs, вы должны загрузить модуль Fact.hs в интерпретатор. Одним из простейших способов сделать это является команда :load command:
Prelude> :load fact.hs
Reading file "fact.hs":
Hugs session for:
/Hugs/lib/Prelude.hs
Fact.hs
Fact>
Отметим, что имя файла в стандартном приглашении к работе, показывает, какой модуль является текущим в среде Hugs. После загрузки этого модуля вы можете начать использовать функцию, которую определили:
Fact> fact 6
720
Fact> fact 6 + fact 7
5760
Fact> fact 7 `div` fact 6
7
Fact>
В качестве другого примера рассмотрим стандартную формулу для количества различных способов выбора R объектов из набора, состоящего из N объектов, имеющую следующий вид: n!/(r!(n-r)!). Простое определение для такой функции в Hugs следующее:
comb n r = fact n `div` (fact r * fact (n-r))
Одним способом использования этой функции является включение её определения как части выражения в Hugs:
Fact> comb 5 2 where comb n r = fact n `div` (fact r * fact (n-r))
10
Fact>
Определение comb в данном случае локально к этому выражению. Если же вы хотите использовать comb несколько раз, то необходимо добавить её определение в файл Fact.hs.
Как только это будет сделано и файл Fact.hs будет перезагружен, вы сможете использовать функцию comb:
Fact> :reload
Reading file "fact.hs":
Hugs session for:
/Hugs/lib/Prelude.hs
Fact.hs
Fact> comb 5 2
10
Fact>
Общие положения
Функции в Haskell'e задаются с помощью равенств. Каждая функция определяется одним или несколькими равенствами. Это так же пример декларации.
num 1 = "one"
num 2 = "two"
Слева стоит имя функции и имена параметров функции. Справа - выражение, которое является значением функции и состоит из функций, констант и имен параметров из левой части.
Знак равенства понимается так:
ЛЧ =β ПЧ
левая часть редуцируется (за один шаг) к правой части. Это действительно равенство: обе части обозначают одну и ту же величину.
Пример функции, увеличивающей число на единицу:
inc :: Int -> Int
inc n = n+1
Пример функции, складывающей два числа:
add :: Int -> Int -> Int
add a b = a + b
В Haskell'e возможны различные способы записи функций, которые разбираются далее.
