Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция ФилП.docx
Скачиваний:
10
Добавлен:
19.09.2019
Размер:
401.58 Кб
Скачать

Язык типов

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

1) a,b,c …

Переменная обозначает любой тип

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

2ой вариант – тип может обозначаться конструктором типа, примененным к заданному числу аргументов.

: конструктор который опр пару – голова и хвост

Для того чтобы задать тип список нужно задать его элементов….

[a] – список (полиморфный)

И

4) Int, Bool, Float, …. (базовые типы)

5) тип картеж, (Int, a), к примеру целое и полиморфный компонент

И самый важный, функциональный тип., 6) конструктор стрелока, -> например тип a->b этоф-ия, котора преобр элементы типа А в элементы типа B

Ф-ия целочисленного сложения имеет тип Int->Int->Int

Оператор стрелка ассоциативен вправо, в соответ с механизмом карирования.

Int->(Int->Int)

Каждому выражению программы написанной на хаскеле можно поставить в соответствие его тип.

Это соответствие задается оператором ::

(это задание типов)

append:: [a]->[a]->[a]

здесь append получает 2 аргумента, однотипные списки, и результатом будет список того же типа.

foldr:: (a->b->b)->b->[a]->b

(справо налево, она в кач первого арг полу тоже функцию, она имеет тип ..нач знач типа b,список с типом а обрабатывает, рез Б)

Еще функция точка (.) это композиция функций, когда функции выстраиваются последовательно. Она получ функцию из а на б

(.):: (a->b) -> (c->a) -> (c->b)

Эти определения типов как пояснения к проге и они еще локализуют… и несоотвествие типов нужно искать уже внутри тогда.

Рассмотрим алгебраические типы данных.

Типы, определяемые пользователем

Data Конструктор_типа =

Конструктор_данных1

| Конструктор_данны2

| Конструктор_данныхN

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

Конструктор типа определяет совокупность вариантов данных, а каждый вариант задается конструктором данных.

Конструкторы типов и данных начиются с большой буквы и могут иметь параметры, которые задают типы компонентов

Пример алг типа

data List a = Nil | Cons a (List a)

deriving (Eq, Ord, Show, Read)

это мы заново определили список. Первый конструктор нил обознач пустой список, второй имеет 2 компонента типа a и типа List a. Это определение списка показывает что алг типы данных могут быть рекурсивными.

Eq равенство, больше меньше, преобр в строку, чтение из строки

[] эквивалентен Nil

: эквивалентно Cons

Перечисляемый тип

data Color = Red | Green | Blue

isRed:: Color->Bool

isRed Red = True

isRed _ = False

*с алгбаич типами данных можно применять сопоставление с образцом.

Конструкторы данных могут содержать значение

data Color’ = Red | Green | Blue | Grayscale Int

поговорим о том почему эти типы алгебраические. Потому что с ними можно выполнять алг операции.

Произведение типов

type дает синоним типу.

type Name = String

type Age = Int

data People = Person Name Age

p = Person “Ann” 20

type string = [Char]

name берет свои значения из множества всех строк

age – minInt .. MaxInt

конструктор Person дает множество значений который определяются декартовым произведением.

Конструкторы данных позволяют строить произведение типов.

Это первая алг операция

Сумма типов

type Pnt = (Float, Float)

data MarkType = Arrow | Cross | Aim

data Shape = Marker Pnt MarkType

| Line Pnt Pnt

| Rect Pnt Pnt

| Circ Pnt Float

area :: Shape -> Float

area (Marker _ _)= 0

area (Line _ _)=0

area(Rect (x1,y1) (x2,y2) )

= abs (x1-x2)*abs(y1-y2)

Area (Circ _ r) = pi*r*r

Тип shape это сумма возможных значений вариантов.

Рассмотрим пример рекурсивного алг типа

Типом Expr задаетяс множество ариф выражений

data Expr = Lit Int | Add Expr Expr

| Sub Expr Expr

Выражение 1+(5-3) представляется так

Add (Lit 1) (Sub (Lit 5) (Lit 3))

Функция, выч варажение

eval:: Expr -> Int

eval (Lit x) = x

eval (Add e1 e2) = eval e1 + eval e2

eval (Sub e1 e2) = eval e1 – eval e2

инфиксные конструкторы

в нашем примере Add и Sub имеют два аргумента, их можно брать в обратные кавычки и исп как операторы.

hit S `Sub` hit 3

в форме data конструкторы могут быть операторами начин двоеточием

data E = L Int | E :+: E | E:-: E

deriving Show

Выражение 1+(5-3) представляется

L 1 :+: (L 5 :-: L 3)

Ф, выч выражение

eval’:: E-> Int

eval’ (L x) = x

eval’ (e1 :+: e2) = eval’ e1 + eval’ e2

eval’ (e1 :-: e2) = eval’ e1 – eval’ e2

y = eval’ (L 1 :+: (L 5 :-: L 3))

Этот пример показывают способ вычисления выражений, семантику.