SlideShare a Scribd company logo
1 of 27
Download to read offline
Çà÷åì íóæíû çàâèñèìûå òèïû

Åâãåíèé Êóðáàöêèé

JetBrains
2013

1 / 27
Çà÷åì íóæíû çàâèñèìûå òèïû

÷òî òàêîå çàâèñèìûé òèï
ñïèñêè ôèêñèðîâàííîé äëèííû
áåçîïàñíûé printf
êîíñòðóêòèâíàÿ ìàòåìàòèêà
ñòàòè÷åñêèå ïðîâåðêè

2 / 27
Çàâèñèìàÿ ôóíêöèÿ

(x : A) → B (x )
f : (x : Bool) -> (if x then String else Int)
f True = "42"
f False = 42

3 / 27
Òèïû òèïîâ

òèï ÿâëÿåòñÿ âûðàæåíèåì

5 : Int
Int : Type
Int -> Int : Type
5 : (if False then String else Int)
(x : Bool) ->
(if x then String else Int) : Type
"What?" : if (isPrime 2147483647) then
String else Int

4 / 27
Ïðîâåðêà òèïîâ

Òîòàëüíûå ôóíêöèè
ôóíêöèÿ âñåãäà çàâåðøàåòñÿ
ôóíêöèÿ âñåãäà âîçâðàùàåò çíà÷åíèå

5 / 27
Idris

ïîääåðæèâàåò çàâèñèìûå òèïû
ñèíòàêñèñ ïîõîæ íà Haskell
íå ëåíèâûå âû÷èñëåíèÿ
àêòèâíî ðàçðàáàòûâàåòñÿ
â äîêëàäå èñïîëüçîâàííà âåðñèÿ 0.9.8

6 / 27
Íàòóðàëüíûå ÷èñëà

data Nat : Type where
Z : Nat
S : Nat - Nat
(+) : Nat - Nat - Nat
Z
+ y = y
(S k) + y = S (k + y)

7 / 27
Ñïèñêè ôèêñèðîâàííîé äëèííû

data List : Type - Type where
Nil : List a
(::) : a - List a - List a
data Vect : Type - Nat - Type where
Nil : Vect a Z
(::) : a - Vect a k - Vect a (S k)
app : Vect a n - Vect a m - Vect a (n + m)
app Nil ys = ys
app (x :: xs) ys = x :: app xs ys

8 / 27
Ñïèñêè ôèêñèðîâàííîé äëèííû

data Vect : Type - Nat - Type where
Nil : Vect a Z
(::) : a - Vect a k - Vect a (S k)
Nil : Vect Int Z
(1 :: 2 :: 3 :: Nil) : Vect Int (S S S Z)
IntVect : Nat - Type
IntVect = Vect Int
(1 :: 2 :: Nil) : IntVect (S S Z)

9 / 27
Ñïèñêè ôèêñèðîâàííîé äëèííû

data Vect : Type - Nat - Type where
Nil : Vect a Z
(::) : a - Vect a k - Vect a (S k)
head : Vect a (S k) - a
head (h :: t) = h
head (1 :: 2 :: 4 :: Nil)
head Nil
defaultHead : Vect a k - a - a
defaultHead Nil default = default
defaultHead v _ = head v
10 / 27
Printf

sprintf Simple!!!
sprintf Hello %s!!! world
sprintf Answer is %d 42
sprintf Mistake %s %d 42 world
sprintf Forgot %d
sprintf Too much %d 1 2

11 / 27
Printf

data Format = End |
FMInt Format |
FMString Format |
FMChar Char Format
parse
parse
parse
parse
parse

: List Char - Format
Nil = End
('%'::'d'::cs) = FMInt (parse cs)
('%'::'s'::cs) = FMString (parse cs)
(c::cs) = FMChar c (parse cs)

12 / 27
ToType
ToType
ToType
ToType
ToType

: Format - Type
End =
(FMInt rest) =
(FMString rest) =
(FMChar c rest) =

String
Int - ToType rest
String - ToType rest
ToType rest

13 / 27
sprintf : (f: String) -
ToType (parse (unpack f))
sprintf fmt = prt (parse (unpack f)) Nil
prt : (f: Format) - List Char - ToType f
prt End acc =
pack acc
prt (FMInt r) acc =
i: Int = prt r (acc ++ (unpack (show i)))
prt (FMString r) acc =
s: String = prt r (acc ++ (unpack s))
prt (FMChar c r) acc =
prt r (acc ++ [c])

14 / 27
Çàâèñèìàÿ ïàðà

d : (x : Bool ** if x then String else Int)
d = (False ** 42)

15 / 27
Êîíñòðóêòèâíàÿ ìàòåìàòèêà

data Or : a - b - Type where
Inl : a - Or a b
Inr : b - Or a b
data And : a - b - Type where
mkAnd : a - b - And
data True : Type
mkTrue : True
data _|_ : Type where
Not : Type - Type
Not a = a - _|_
16 / 27
Êîíñòðóêòèâíàÿ ìàòåìàòèêà

Ìàòåìàòèêà

Òèïû

Äîêçàòåëüñòâî

Òåðì

Òåîðåìà

Òèï

True
False
A→B
A∧B
A∨B
¬A
∀x ∈ A B (x )
∃x ∈ A B (x )

True (Unit)
_|_
A - B
And A B (Ïàðà)
Or A B (Either)
A - _|_
(x : A) - B x
(x : A ** B x)

Èíäóêöèÿ

Ðåêóðñèÿ
17 / 27
Ïðèìåð

A∨B →B ∨A

Or a b - Or b a
lemma1 : Or a b - Or b a
lemma1 (Inl av) = (Inr av)
lemma1 (Inr bv) = (Inl bv)

18 / 27
Ïðèìåð

(

A → B ) → (B → C ) → (A → C )

(a - b) - (b - c) - (a - c)

lemma2 : (a - b) - (b - c) - (a - c)
lemma2 f1 f2 = (x = f2 (f1 x))

19 / 27
Ðàâåíòñâî

data (=) : t - t - Type where
refl : (a : t) - a = a

20 / 27
Ðàâåíòñâî

∀a1 ∈ T , ∀a2 ∈ T ,

a1 = a2 → a2 = a1

symm : (a1 : t) - (a2 : t) -
(a1 = a2) - (a2 = a1)
symm _ _ (refl a) = (refl a)

21 / 27
Ðàâåíòñâî

∀a ∈ T , ∀b ∈ T , ∀p (T ),

a = b → p(a) = p(b)

apply : (a : t) - (b : t) -
(p : t - t1) -
(a = b) - (p a) = (p b)
apply _ _ p (refl x) = refl (p x)

22 / 27
Ïðèìåð

(+) : Nat - Nat - Nat
Z
+ y = y
(S k) + y = S (k + y)
∀a, b, c ∈ N, a + (b + c ) = (a + b) + c

assoc : (a : Nat) - (b : Nat) -
(a + (b + c)) = ((a + b)
assoc Z b c = refl (b + c)
assoc (S a) b c = apply (a + (b +
((a + b) + c) S (assoc a

(c : Nat) -
+ c)
c))
b c)

23 / 27
Ïðîâåðêè âî âðåìÿ êîìïèëÿöèè

data so : Bool - Type where
oh : so True
test : Bool
test1 : so test
test1 = oh
test2 : so (2 * 2 == 4)
test2 = oh
testFail : so (2 * 2 == 5)
testFail = oh
24 / 27
Ñòàòè÷åñêèå îãðàíè÷åíèÿ

data () : Nat - Nat - Type where
lessZ : Z  (S k)
lessS : k1  k2 - (S k1)  (S k2)
Array : Type - Nat - Type
get: (Array a sz) - (i: Nat ** i  sz) - a

25 / 27
lemma : i  n - i  (S n)
lemma lessZ = lessZ
lemma (lessS a) = lessS (lemma a)
range2 : (n : Nat) - (i : Nat) - i  (S n) -
List (a : Nat ** a  n)
range2 n Z lessZ = []
range2 n (S i) (lessS iln) =
(i ** iln) :: (range2 n i (lemma iln))
subList : (n : Nat) - (i : Nat) - (i  S n) -
Array a n - List a
subList n i prf a = map (get a) (range2 n i prf)

26 / 27
Ñïàñèáî çà âíèìàíèå

Âîïðîñû?

27 / 27

More Related Content

What's hot

From Javascript To Haskell
From Javascript To HaskellFrom Javascript To Haskell
From Javascript To Haskellujihisa
 
งานนำเสนอ1
งานนำเสนอ1งานนำเสนอ1
งานนำเสนอ1Salawin Kuntadong
 
2. Базовый синтаксис Java
2. Базовый синтаксис Java2. Базовый синтаксис Java
2. Базовый синтаксис JavaDEVTYPE
 
Sheep knee joint synovium histology
Sheep knee joint synovium histologySheep knee joint synovium histology
Sheep knee joint synovium histologyXuejun Du
 
Lista plantão 02 - sétimo ano
Lista plantão 02 - sétimo anoLista plantão 02 - sétimo ano
Lista plantão 02 - sétimo anoProf. Materaldo
 

What's hot (6)

From Javascript To Haskell
From Javascript To HaskellFrom Javascript To Haskell
From Javascript To Haskell
 
งานนำเสนอ1
งานนำเสนอ1งานนำเสนอ1
งานนำเสนอ1
 
2. Базовый синтаксис Java
2. Базовый синтаксис Java2. Базовый синтаксис Java
2. Базовый синтаксис Java
 
Sheep knee joint synovium histology
Sheep knee joint synovium histologySheep knee joint synovium histology
Sheep knee joint synovium histology
 
Lista plantão 02 - sétimo ano
Lista plantão 02 - sétimo anoLista plantão 02 - sétimo ano
Lista plantão 02 - sétimo ano
 
Komputer Grafik
Komputer GrafikKomputer Grafik
Komputer Grafik
 

Similar to Евгений Курбацкий. Зачем нужны зависимые типы

Truth, deduction, computation lecture g
Truth, deduction, computation   lecture gTruth, deduction, computation   lecture g
Truth, deduction, computation lecture gVlad Patryshev
 
Outrageous Ideas for Graph Databases
Outrageous Ideas for Graph DatabasesOutrageous Ideas for Graph Databases
Outrageous Ideas for Graph DatabasesMax De Marzi
 
digital logic design Chapter 2 boolean_algebra_&_logic_gates
digital logic design Chapter 2 boolean_algebra_&_logic_gatesdigital logic design Chapter 2 boolean_algebra_&_logic_gates
digital logic design Chapter 2 boolean_algebra_&_logic_gatesImran Waris
 
「Frama-Cによるソースコード検証」 (mzp)
「Frama-Cによるソースコード検証」 (mzp)「Frama-Cによるソースコード検証」 (mzp)
「Frama-Cによるソースコード検証」 (mzp)Hiroki Mizuno
 
Assignment on Numerical Method C Code
Assignment on Numerical Method C CodeAssignment on Numerical Method C Code
Assignment on Numerical Method C CodeSyed Ahmed Zaki
 
하스켈 프로그래밍 입문 3
하스켈 프로그래밍 입문 3하스켈 프로그래밍 입문 3
하스켈 프로그래밍 입문 3Kwang Yul Seo
 
All I Needed for Functional Programming I Learned in High School Algebra
All I Needed for Functional Programming I Learned in High School AlgebraAll I Needed for Functional Programming I Learned in High School Algebra
All I Needed for Functional Programming I Learned in High School AlgebraEric Normand
 
User Defined Aggregation in Apache Spark: A Love Story
User Defined Aggregation in Apache Spark: A Love StoryUser Defined Aggregation in Apache Spark: A Love Story
User Defined Aggregation in Apache Spark: A Love StoryDatabricks
 
User Defined Aggregation in Apache Spark: A Love Story
User Defined Aggregation in Apache Spark: A Love StoryUser Defined Aggregation in Apache Spark: A Love Story
User Defined Aggregation in Apache Spark: A Love StoryDatabricks
 
CROCHET - Checkpoint Rollback in JVM (ECOOP 2018)
CROCHET - Checkpoint Rollback in JVM (ECOOP 2018)CROCHET - Checkpoint Rollback in JVM (ECOOP 2018)
CROCHET - Checkpoint Rollback in JVM (ECOOP 2018)jon_bell
 
Add math may june 2016 p1
Add math may june 2016 p1Add math may june 2016 p1
Add math may june 2016 p1Don Cunningham
 
Programming for Problem Solving
Programming for Problem SolvingProgramming for Problem Solving
Programming for Problem SolvingSreedhar Chowdam
 

Similar to Евгений Курбацкий. Зачем нужны зависимые типы (20)

Intro To Agda
Intro To AgdaIntro To Agda
Intro To Agda
 
Truth, deduction, computation lecture g
Truth, deduction, computation   lecture gTruth, deduction, computation   lecture g
Truth, deduction, computation lecture g
 
Graph Algebra
Graph AlgebraGraph Algebra
Graph Algebra
 
Outrageous Ideas for Graph Databases
Outrageous Ideas for Graph DatabasesOutrageous Ideas for Graph Databases
Outrageous Ideas for Graph Databases
 
digital logic design Chapter 2 boolean_algebra_&_logic_gates
digital logic design Chapter 2 boolean_algebra_&_logic_gatesdigital logic design Chapter 2 boolean_algebra_&_logic_gates
digital logic design Chapter 2 boolean_algebra_&_logic_gates
 
「Frama-Cによるソースコード検証」 (mzp)
「Frama-Cによるソースコード検証」 (mzp)「Frama-Cによるソースコード検証」 (mzp)
「Frama-Cによるソースコード検証」 (mzp)
 
Cpl
CplCpl
Cpl
 
Assignment on Numerical Method C Code
Assignment on Numerical Method C CodeAssignment on Numerical Method C Code
Assignment on Numerical Method C Code
 
Math 3-H6
Math 3-H6Math 3-H6
Math 3-H6
 
Software engineering
Software engineeringSoftware engineering
Software engineering
 
Compiling fµn language
Compiling fµn languageCompiling fµn language
Compiling fµn language
 
b
bb
b
 
하스켈 프로그래밍 입문 3
하스켈 프로그래밍 입문 3하스켈 프로그래밍 입문 3
하스켈 프로그래밍 입문 3
 
All I Needed for Functional Programming I Learned in High School Algebra
All I Needed for Functional Programming I Learned in High School AlgebraAll I Needed for Functional Programming I Learned in High School Algebra
All I Needed for Functional Programming I Learned in High School Algebra
 
User Defined Aggregation in Apache Spark: A Love Story
User Defined Aggregation in Apache Spark: A Love StoryUser Defined Aggregation in Apache Spark: A Love Story
User Defined Aggregation in Apache Spark: A Love Story
 
User Defined Aggregation in Apache Spark: A Love Story
User Defined Aggregation in Apache Spark: A Love StoryUser Defined Aggregation in Apache Spark: A Love Story
User Defined Aggregation in Apache Spark: A Love Story
 
CROCHET - Checkpoint Rollback in JVM (ECOOP 2018)
CROCHET - Checkpoint Rollback in JVM (ECOOP 2018)CROCHET - Checkpoint Rollback in JVM (ECOOP 2018)
CROCHET - Checkpoint Rollback in JVM (ECOOP 2018)
 
Add math may june 2016 p1
Add math may june 2016 p1Add math may june 2016 p1
Add math may june 2016 p1
 
Programming for Problem Solving
Programming for Problem SolvingProgramming for Problem Solving
Programming for Problem Solving
 
Practice Test 2 Solutions
Practice Test 2  SolutionsPractice Test 2  Solutions
Practice Test 2 Solutions
 

Евгений Курбацкий. Зачем нужны зависимые типы