Лекции.ИНФО


Конструкции if-then-else и case



Haskell, как и большинство других языков программирования, поддерживает условную конструкцию if-then-else.

 

doubleSmallNumber x = if x > 100 then x else x * 2

 

Отличие его от аналогов во многих других языках программирования состоит в том, что часть else в Haskell является обязательной, поскольку в Haskell каждое выражение и функция должны вернуть какой-нибудь результат. Еще одна особенность оператора if в Haskell состоит в том, что он рассматривается как выражение. Выражением называется кусок кода, который возвращает результат. Так как else является обязательным, оператор if всегда возвращает некоторое значение, потому и является выражением. Если необходимо прибавить 1 к каждому числу, которое возвращается предыдущей функцией, можно записать так:

 

doubleSmallNumber' x = (if x > 100 then x else x * 2) + 1

 

Если опустить скобки, единица прибавлялась бы только к числам, которые не превышают 100.

Haskell также поддерживает конструкцию case. Предположим, необходимо создать функцию, которая возвращает 1 при аргументе 0, 5 при аргументе 1, 2 при аргументе 2 и -1 при всех других аргументах. Используя case, можно записать ее следующим образом:

 

f x = case x of 0 -> 1 1 -> 5 2 -> 2 _ -> -1

 

Отступы здесь очень важны. Haskell для структуризации кода использует систему, которая называется layout (Python использует аналогичную систему). Эта система позволяет писать код без использования скобок и точек с запятыми, как этого требуют языки C, Java и многие другие. Она включает следующие правила:

● каждый оператор начинается с новой строки;

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

Например, представленную выше функцию doubleSmallNumber можно переписать так:

 

doubleSmallNumber x = if x > 100 then x else x * 2

 

Некоторые программисты предпочитают не использовать такой стиль написания кода и писать фигурные скобки и точки с запятыми в явном виде. Это вполне приемлемо. Приведенный выше код с конструкцией case и следующий совершенно аналогичны:

 

f x = case x of { 0 -> 1 ; 1 -> 5 ; 2 -> 2 ; _ -> 1 }

 

При явном использовании скобок и разделителей появляется свобода в структурировании кода.

Кусочное определение функций

Функции также могут быть определены кусочно. Это означает, что можно написать одну версию функции для определенных параметров, а затем другую ее версию для других параметров. Например, функцию f можно определить так:

 

f 0 = 1 f 1 = 5 f 2 = 2 f _ = -1

 

Здесь важен порядок описания версий. Если переместить последнюю строку в начало, она будет соответствовать каждому аргументу, и функция f будет возвращать значение -1 вне зависимости от аргумента (большинство компиляторов предупреждают о таких последствиях). Если же вообще не включить последнюю строчку в файл, то при вызове функции f с любыми параметрами (кроме 0, 1 и 2) будет генерироваться ошибка (большинство компиляторов также предупреждают и о таких последствиях). В данном примере используется знак подчеркивания, поскольку в вычислениях значение аргумента не участвует, т.е. этот знак соответствует мнимой переменной. Если результат зависит от аргумента, то вместо знака подчеркивания следует использовать некоторую определенную переменную (например, x).

Содержание отчета

1. Титульный лист с указанием названия лабораторной работы.

2. Цель работы.

3. Номер варианта.

4. Задание.

5. Исходный код разработанных функций.

6. Результаты тестирования разработанных функций.

Варианты заданий

Во всех вариантах в третьем задании создать три варианта функции: с использованием конструкции if-then-else, с использованием конструкции case и с использованием кусочного определения функции (для разделения версий функции можно добавлять к ее имени апострофы).

Функции по всем трем заданиям можно описать в одном файле (имя выбрать произвольным).

Вариант 1

1. Определить функцию isRectangular, принимающую в качестве аргументов три числа — длины сторон треугольника — и проверяющую, является ли этот треугольник прямоугольным.

2. Определить функцию toDegrees, принимающую в качестве параметра величину угла в радианах и конвертирующую ее в градусы.

3.

Вариант 2

1. Определить функцию isTriangle, принимающую в качестве аргументов три числа и проверяющую, возможно ли построить невырожденный треугольник с такими длинами сторон. Функция возвращает True, если это возможно, и False в противном случае.

2. Определить функцию toRadians, принимающую в качестве параметра величину угла в градусах и конвертирующую ее в радианы.

3.

Вариант 3

1. Определить функцию isSortedAcs, принимающую в качестве аргументов три числа и возвращающую True, если они отсортированы по возрастанию, и False в противном случае.

2. Определить функцию isDivisor, принимающую в качестве аргументов два целых числа и возвращающую True, если первое число является делителем второго, и False в противном случае.

3.

Вариант 4

1. Определить функцию isSortedDesc, принимающую в качестве аргументов три числа и возвращающую True, если они отсортированы по убыванию, и False в противном случае.

2. Определить функцию isMultiple, принимающую в качестве аргументов два целых числа и возвращающую True, если первое число является кратным второго, и False в противном случае.

3.

Вариант 5

1. Определить функцию circumference, принимающую в качестве аргумента радиус окружности и возвращающую ее длину.

2. Определить функцию maxOfThree, принимающую в качестве аргументов три числа и возвращающую максимальное из них.

3.

Вариант 6

1. Определить функцию areaOfDisk, принимающую в качестве аргумента радиус круга и возвращающую его площадь.

2. Определить функцию minOfThree, принимающую в качестве аргументов три числа и возвращающую минимальное из них.

3.

Контрольные вопросы

1. Какими командами GHCi выполняется загрузка файла и повторная загрузка последнего файла?

2. Формат определения функций.

3. Композиция функций.

4. Особенности конструкции if-then-else.

5. Формат конструкции case.

6. Система структуризации кода Haskell.

7. Кусочное определение функций.

Лабораторная работа №3.
Списки и кортежи. Типы и классы типов

Цели работы.

Изучение основ работы со списками и кортежами в Haskell. Изучение базовых функций для работы со списками и кортежами. Знакомство с основными типами данных и классами типов.









Читайте также:

  1. Архитектура и строительные конструкции
  2. Выбор и обоснование конструкции скважины
  3. Глагольные конструкции с инфинитивом
  4. Для реконструкции требуется принимать участки из сформированных на каждом шаге, которые обладают минимальной материальной характеристикой.
  5. Е4-1-49.Укладка бетонной смеси в конструкции
  6. Железобетонные несущие и ограждающие конструкции покрытия промышленных зданий. Плита-оболочка КЖС, плиты ребристые и типа «2Т». Прогонные и безпрогонные покрытия.
  7. Здания из крупных блоков. Основные конструктивные схемы, виды разрезки стен на элементы. Типы, конструкции и материалы блоков, узлы сопряжения блоков.
  8. Изменение конструкции помещений.
  9. Когда все конструкции сознательного ума растворяются в чистом сознании, обретается наше самое глубинное и подлинное Я
  10. Конструктивные решения тепловых сетей при подземной и надземной прокладке. Конструкции узлов теплопроводов, трубы и арматура. Прочностной расчет трубопроводов.
  11. Конструкции покрытий промышленных зданий


Последнее изменение этой страницы: 2016-03-25; Просмотров: 52;


lektsia.info 2017 год. Все права принадлежат их авторам! Главная