Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ФП_ЛР №3-4.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2 Mб
Скачать

Лабораторная работа №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 возможны различные способы записи функций, которые разбираются далее.