Haskell, 05 лекция (от 26 октября)

Материал из eSyr's wiki.

Версия от 15:15, 29 октября 2010; ESyr01 (Обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

...

Состояния в программе:

  1. Неявное
  2. Монотонное
  3. Линейное
  4. Управляемое
  5. ...
  6. ..
  7. Reserved
  8. Reserved
  9. Many threads

И желательно не опускаться ниже уровня 2-3.

Интересные функц. языки с точки зрения леткора:

  1. Erlang/OTP
  2. ML, Caml, ocaml
  3. Haskell

Синтаксис haskell

Списки имеют один тип. Три операции:

  1.  : — конструктор
  2. head — голова
  3. tail — хвост
  4. [] — пустой список

Конструирование списков:

1:[]
a → [a] → [a]
[1]

Списки можно опр. след. образом: [1,2,3], это явл. синт. сахаром и эквив. 1:2:3:[]

Если захочется напистаь generic-алгоритм по работе со списками на С++, понадобятся итераторы, в STL их 5 штук и в итге получается довольно кудрявый код.

Функции

<имя фукции> <arglist> = <body>
add x y = x + y
λ x . λ y . x + y

Тип функцииЖ

add :: a → a → a → a

Каррирование:

inc = add 1

более корректно с мат. точки зрения было бы inc x = add x 1, но в хаскелле можно и так.

Кроме этого, параметрами функции могут быть списки, при этом можно исп. такую особенность языка как pattern matching. В испреативном языке часто в реализации функций имеется ветвление на основе входных параметров. В хаскеле можно описывать неск. реализаций в зависимости от параметров, которые были переданы.

head :: [a] → a
head [] = error "empty"
head (x:t) = x

Функция error прерывает вып. программы с некотором error message. Если на вход пришли некорр. данныЕ, то если в С/С++ что-то омжно сделать, то что делать в прогр. на функц. языке делать не совсем понятно, поск. ждут корр. результата.

tail:

tail :: [a] → [a]
tail [] = error "empty"
tail (x:t) = t

Если переменная в pattern matching не исп., то вместо неё можно исп. "_": head (x:_).

s :: [a] → a
s [] = [[]]
s l@(x:t) = l:s t

Как выглядит в haskell λ-нотация.

\ x y → x + y

казалось бы, более корректной была бы

\ x → \ y → x + y

но можно писать и так, и так.

Определение списков-диапазонов:

[1..10]
[1,3..11]
[1..]

Пример использования λ:

map (\ x → x * x * x) [1..]

В рез-те получится список кубов нат. чисел.

Фильтры:

l = [1,2,3,4]
[x|x←l, x<3]

Операция конкуатенации списков:

[1,2] ++ [3,4]

Быстрая сортировка:

q:[] = []
q(x:t) = q [y|ylarr;t,y<x] ++ [x] ++ q [y|y←t, y >= x]

Определение новых типов

Определение синонимов: есть стандартные типы Char, String, последний ялвяется списком, содержащим элементы первого типа. Поэтому, string — синоним, опр. след. образом:

typename String = [ char ]
data Bool = False | True
data Color a = Color a a a
x = Color 1 1 1
Color Int

В том, что имя конструктора совпадает с именем типа, ничего страшного нет.

data Maybe a = Just a | Nothing

В этом случае рез-т будет иметь один и тот же тип и при этом можно


Теория функционального программирования. Язык Haskell


00 01 02 03 04 05 06 07 08 09 10 11 12


Календарь

Сентябрь
23 28
Октябрь
05 12 19 26
Ноябрь
02 09 16 23 30
Декабрь
07 14


Эта статья является конспектом лекции.

Эта статья ещё не вычитана. Пожалуйста, вычитайте её и исправьте ошибки, если они есть.
Личные инструменты
Разделы