Haskell, 05 лекция (от 26 октября)
Материал из eSyr's wiki.
(Новая: ... Состояния в программе: # Неявное # Монотонное # Линейное # Управляемое # ... # .. # Reserved # Reserved # Many threads И же...) |
|||
Строка 1: | Строка 1: | ||
+ | * '''Презентация:''' [[Media:ТФП -- Лекция 5.pdf]] | ||
+ | * '''Аудиозапись:''' http://esyr.org/lections/audio/haskell_2010_winter/haskell_10_10_26.ogg | ||
+ | * '''Видеозапись:''' http://esyr.org/video/haskell/haskell_10_10_26.raw.ogv | ||
+ | |||
... | ... | ||
Текущая версия
- Презентация: Media:ТФП -- Лекция 5.pdf
- Аудиозапись: http://esyr.org/lections/audio/haskell_2010_winter/haskell_10_10_26.ogg
- Видеозапись: http://esyr.org/video/haskell/haskell_10_10_26.raw.ogv
...
Состояния в программе:
- Неявное
- Монотонное
- Линейное
- Управляемое
- ...
- ..
- Reserved
- Reserved
- Many threads
И желательно не опускаться ниже уровня 2-3.
Интересные функц. языки с точки зрения леткора:
- Erlang/OTP
- ML, Caml, ocaml
- Haskell
[править] Синтаксис haskell
Списки имеют один тип. Три операции:
- : — конструктор
- head — голова
- tail — хвост
- [] — пустой список
Конструирование списков:
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 |