Вячеслав Шебанов
“Пусть в некой деревне живёт брадобрей, который бреет всех жителей деревни, которые не бреются сами, и только их.
Бреет ли брадобрей сам себя?
let isDone: boolean = false;
let someNumber: number = 10;
Чтобы в вашей программе не было парадоксов (ошибок)
Можем ли мы, описав некое утверждения специальным образом, ответить на вопрос с помощью общего метода является ли это утверждение истиной всегда
(λx . x) z
(λx . x) z → z
(λx. x) (λx. x)
(λx. x) (λx. x) → (λx. x)
function identity(x) {
return x;
}
(λx:Bool . x):Bool
function identity(x: number): number {
return x;
}
(λx:Int y:Int . x * y): Int
function mult(x: number, y: number): number {
return x * y;
}
function saySomething(cat: Cat) {
return 'Meow';
}
function saySomething(dog: Dog) {
return 'Woof';
}
function saySomething(cat: Cat) {
return 'Meow';
}
function saySomething(dog: Dog) {
return 'Woof';
}
> saySomething(cat);
"Meow"
> saySomething(dog);
"Woof"
function identity<T>(arg: T): T {
return arg;
}
λx:Bool . x
λX. λx:X. x
id = λX. λx:X. x
|> id : ∀X. X → X
(λX. λx:X. x) Bool
λx:Bool. x
func Print[T any](s []T) {
for _, v := range s {
fmt.Println(v)
}
}
Print[int](arrayOfInts)
(Records)
struct Person
{
char name[50];
int age;
float salary;
};
(λx:Int y:Int . x * y) a b
Если a и b это Int
(λx:Int y:Int . x * y) a b
→
a * b
Даны описание процедуры и её начальные входные данные, требуется определить, завершится ли когда-либо выполнение процедуры с этими данными.
Любая функция, которая может быть вычислена физическим устройством, может быть вычислена машиной Тьюринга
Простое типизированное лямбда-исчисление
System F
Тотальной называется такая функция, которая гарантированно завершается за конечное количество шагов и определена на всех разрешенных входных параметрах
function identity(x: Bool): Bool {
return x;
}
function identity<T>(x: T): T {
return x;
}
Типы высшего рода (Higher Kinded Types) и семейства типов (Type Families) в Haskell
function random(n: Nat) : Fin<n> {
return ...;
}
Задавайте вопросы после доклада!
Продолжаем заимствования из логики
let x = vec![1, 2, 3];
let y = x; // NOTE: x moved here
println!("{:?}", x); // ERROR: use of moved value x
pritnln!("{:?}", y); // OK
HoTT и Кубические типы
http://theannotatedturing.com/ — книга про работу Тьюринга, про работу над проблемой разрешимости. С историческими справками и большим количеством контекста
https://hackernoon.com/java-is-unsound-28c84cb2b3f — про то, что у Java и Scala unsound системы типов
https://compsciclub.ru/courses/Glasgow-Haskell-Compiler/2018-spring/ — лекции про то, как устроен компилятор Haskell и его теоретические основы
https://compsciclub.ru/courses/systemsoftypedlambdacalculi/2011-spring/ — лекции про типизрованное лямбда-исчисление
https://gitlab.haskell.org/ghc/ghc/-/wikis/linear-types/roadmap — Роадмап имплементации ли нейных типов в Haskell
http://homepages.inf.ed.ac.uk/wadler/papers/propositions-as-types/propositions-as-types.pdf — снова Уодлер, про Карри-Говарда и историю. Можно видео (https://www.youtube.com/watch?v=IOiZatlZtGU)
https://softwarefoundations.cis.upenn.edu/ — похоже на TAPL, но с уклоном в практику
https://github.com/namin/unsound/blob/master/doc/unsound-oopsla16.pdf — пейпер про unsoundness Java и Scala
https://pdfs.semanticscholar.org/3076/c162530c8a859e4c89556ede4783465430fb.pdf?_ga=2.81413716.276970782.1540919121-786323898.1540919121 — оригинальная работа про лямбда-куб
http://typetheorypodcast.com/ — подкаст про теорию типов, всего 6 выпусков
Twitter: @thought_sync
function zip<T1, T2>(list1: Array<T1>, list2: Array<T2>): Array<Pair<T1, T2>> {
if (list1.length !== list2.length) {
throw Error('Arrays lengths are not equal');
}
let result = [];
for (let i = 0; i < list1.length; i++) {
result[i] = pair(list1[i], list2[i]);
}
return result;
}
function zip<T1, T2>(list1: Array<T1>, list2: Array<T2>)
Array<Pair<T1, T2>>
if (list1.length !== list2.length) {
throw Error('Arrays lengths are not equal');
}
let result = [];
for (let i = 0; i < list1.length; i++) {
result[i] = pair(list1[i], list2[i]);
}
return result;
Vect<T, n>
T — тип элемента
n — кол-во элементов
function zip<T1, T2>(v1: Vect<T1, n>, v2: Vect<T2, n>): Vect<Pair<T1, T2>, n> {
let result = [];
for (let i = 0; i < n; i++) {
result[i] = pair(v1[i], v2[i]);
}
return result;
}
function zip<T1, T2>(v1: Vect<T1, n>, v2: Vect<T2, n>)
Vect<Pair<T1, T2>, n>
function vectToList<T>(list: Array<T>) : DPair(n: Nat, Vect<T, n>) {
return dpair(list.length, toVect(list));
}
function vectToList<T>(list: Array<T>)
DPair(n: Nat, Vect<T, n>)
return dpair(list.length, toVect(list));