Списки в языке Haskell.

Содержание

Слайд 2

Еще один способ вычисления факториала.

Кубенский А.А. Функциональное программирование.

Глава 1. Элементы функционального программирования.

factorial

Еще один способ вычисления факториала. Кубенский А.А. Функциональное программирование. Глава 1. Элементы
:: Integer -> Integer
prodList' :: [Integer] -> Integer -> Integer
factorial n = prodList' [1..n] 1
prodList' [] p = p
prodList' (x:ls) p = prodList' ls (p*x) -- концевая рекурсия

Несколько стандартных операций над списком и их определения.

head :: [a] -> a
head (x:ls) = x
head [] = error "head: empty list"

tail :: [a] -> [a]
tail (x:ls) = ls
tail [] = error "tail: empty list"

length :: [a] -> Int
length (x:ls) = 1 + length ls
length [] = 0

null :: [a] -> Bool
null (x:ls) = False
null [] = True

Слайд 3

Более сложные функции обработки списков.

Кубенский А.А. Функциональное программирование.

Глава 1. Элементы функционального программирования.

last

Более сложные функции обработки списков. Кубенский А.А. Функциональное программирование. Глава 1. Элементы
:: [a] -> a
last [] = error "last: empty list"
last [x] = x
last (x:ls) = last ls

init :: [a] -> [a]
init [] = error "init: empty list"
init [x] = []
init (x:ls) = x : init ls

(!!) :: [a] -> Int -> a
[] !! _ = error "(!!): empty list"
(x:ls) !! 0 = x
(x:ls) !! n = ls !! (n-1)

(++) :: [a] -> [a] -> [a]
[] ++ ls = ls
(x:l1) ++ l2 = x : (l1 ++ l2)

reverse :: [a] -> [a]
reverse' :: [a] -> [a] -> [a]
reverse ls = reverse' ls []
reverse' [] l = l
reverse' (x:ls) l = reverse' ls (x:l)

Слайд 4

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

Кубенский А.А. Функциональное программирование.

Глава 1. Элементы функционального программирования.

Определение

1.3. Определение новых типов данных. Кубенский А.А. Функциональное программирование. Глава 1. Элементы
синонимов для типов

type String = [Char]
type Coord = (Double, Double)
type Pair a = (a, a)
type Complex = Pair Double

Использование синонимов

find :: String -> Char -> Int
find [] _ = -1
find (x:s) y | x == y = 0
| otherwise = 1 + find s y

distance :: Coord -> Coord -> Double
distance (x1, y1) (x2, y2) = sqrt ((x2-x1) * (x2-x1) + (y2-y1) * (y2-y1))

complexAdd :: Complex -> Complex -> Complex
complexAdd (r1, i1) (r2, i2) = (r1+r2, i1+i2)

swap :: Pair a -> Pair a
swap (x, y) = (y, x)

Слайд 5

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

Кубенский А.А. Функциональное программирование.

Глава 1. Элементы функционального программирования.

Определение

1.3. Определение новых типов данных. Кубенский А.А. Функциональное программирование. Глава 1. Элементы
конструкторов

data WeekDay = Sun | Mon | Tue | Wed | Thu | Fri | Sat
data Bool = False | True

Использование конструкторов

weekend :: WeekDay -> Bool
weekend Sun = True
weekend Sat = True
weekend _ = False

Конструкторы с параметром

data Coord = Point Double Double
data Pair a = Couple a a

Использование конструкторов с параметрами

distance :: Coord -> Coord -> Double
distance (Point x1 y1) (Point x2 y2) =
sqrt ((x2-x1) * (x2-x1) + (y2-y1) * (y2-y1))

swap :: Pair a -> Pair a
swap (Couple x y) = Couple y x

data Coord = Coord Double Double
data Pair a = Pair a a

distance :: Coord -> Coord -> Double
distance (Coord x1 y1) (Coord x2 y2) =
sqrt ((x2-x1) * (x2-x1) + (y2-y1) * (y2-y1))

swap :: Pair a -> Pair a
swap (Pair x y) = Pair y x

Слайд 6

Кубенский А.А. Функциональное программирование.

Глава 1. Элементы функционального программирования.

Сложные типы данных.

data IntList =

Кубенский А.А. Функциональное программирование. Глава 1. Элементы функционального программирования. Сложные типы данных.
Nil | Cons Integer IntList

sumList :: IntList -> Integer
sumList Nil = 0
sumList (Cons e ls) = e + sumList ls

data List a = Nil | a :+: (List a)

sumList :: List Integer -> Integer
sumList Nil = 0
sumList (e :+: ls) = e + sumList ls

sumList :: (Num a) => List a -> a
sumList Nil = 0
sumList (e :+: ls) = e + sumList ls

data [a] = [] | a : [a]

sumList :: (Num a) => [a] -> a
sumList [] = 0
sumList (e : ls) = e + sumList ls

Сортировка списка.

insert :: (Ord a) => a -> [a] -> [a]
insert elem [] = [elem]
insert elem list@(x:s) | elem < x = elem:list
| otherwise = x:(insert elem s)

bubble :: (Ord a) => [a] -> [a]
bubble [] = []
bubble (x:s) = insert x (bubble s)

Слайд 7

Определение и обработка двоичного дерева.

Кубенский А.А. Функциональное программирование.

Глава 1. Элементы функционального программирования.

data

Определение и обработка двоичного дерева. Кубенский А.А. Функциональное программирование. Глава 1. Элементы
Tree a = Empty |
Node (Tree a) a (Tree a)

myTree :: Tree Char
myTree = Node (Node
(Node Empty 'D' Empty)
'B'
Empty)
'A'
(Node
(Node Empty 'E' Empty)
'C'
(Node Empty 'F' Empty))

height :: Tree a -> Int
height Empty = 0
height (Node t1 _ t2) = 1 + max (height t1) (height t2)

Слайд 8

Кубенский А.А. Функциональное программирование.

Глава 1. Элементы функционального программирования.

Сортировка с помощью двоичного дерева.

9

2

6

1

4

8

sort

Кубенский А.А. Функциональное программирование. Глава 1. Элементы функционального программирования. Сортировка с помощью
:: (Ord a) => [a] -> [a]
build :: (Ord a) => [a] -> Tree a
flatten :: Tree a -> [a]
sort ls = flatten (build ls)
Имя файла: Списки-в-языке-Haskell..pptx
Количество просмотров: 153
Количество скачиваний: 1