ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Вычисление факториалаСледующий пример показывает синтаксис языка Haskell при реализации функции для вычисления факториала: fac:: Integer -> Integer fac 0 = 1 fac n | n > 0 = n * fac (n - 1)Это определение описывает процесс вычисления факториала в виде рекурсивной функции. Это определение похоже на то, которое можно найти в учебниках по информатике. Большая часть исходного кода на языке Haskell походит на математическую нотацию в аспектах синтаксиса и использования, например, вышеприведённый пример можно переписать в виде fac n = product [1..n]что соответствует математическому определению факториала. Первая строка в приведённом выше коде необязательна и является объявлением функционального типа, то есть задаёт типы аргументов (указаны до последней «->») и тип возвращаемого значения (указан после последней «->»). Эта строка может быть прочитана как: функция fac имеет тип (::) из целого в целое (Integer -> Integer). Это значит, что она получает на вход один целочисленный аргумент (записан слева от «->») и возвращает результат также целого типа (записан справа от «->»). Если программист не указал типы явно, компилятор или интерпретатор может определить их автоматически. Вторая и третья строки формируют определение тела функции. Определение состоит из предложений, или «клауз» (англ. clause). Каждое предложение представляет собой пару «образец — выражение». Компилятор или интерпретатор использует механизм сопоставления с образцом для выбора одного из выражений. В данном случае вторая строка определения будет выбрана тогда, когда фактический параметр при вызове функции fac будет равен нулю. В третьей строке помимо механизма сопоставления с образцами использовано охраняющее выражение — n > 0. Оно гарантирует, что функция не будет работать для отрицательных чисел, для которых факториал неопределён. Если отрицательное число будет передано в качестве фактического параметра в функцию fac, то программа остановится с сообщением об ошибке.[1] Калькулятор Простейший калькулятор для вычисления выражений в обратной польской записи может быть определён на языке Haskell при помощи одной функции: calc:: String -> Float calc = head. foldl f []. words where f:: [Float] -> String -> [Float] f (x:y:zs) "+" = (y + x):zs f (x:y:zs) "-" = (y - x):zs f (x:y:zs) "*" = (y * x):zs f (x:y:zs) "/" = (y / x):zs f (x:y:zs) "FLIP" = y:x:zs f (x:zs) "ABS" = (abs x):zs f xs y = read y: xsИсходная строка со входным выражением тут разбивается стандартной функцией words на список слов — строк между пробельными символами — который обрабатывается функцией левосторонней свёртки (foldl) слева направо по одному слову с помощью функции f, которая поддерживает рабочий список прочитываемых чисел и промежуточных значений (поначалу [] — пустой список) и интерпретирует каждое входное слово как обозначение арифметической функции или как число, в ходе вычисления ею окончательного значения выражения (которое будет первым оставшимся значением в рабочем списке по окончании обработки списка слов входного выражения, так что его можно достать оттуда с помощью стандартной функции head).[1] Не нашли, что искали? Воспользуйтесь поиском:
|