LINUX.ORG.RU

История изменений

Исправление quasimoto, (текущая версия) :

Очевидно, что не нужно, т.к. редуцировать их нельзя.

Можно — что в обычном лямбда исчислении (см. Barendregt — 3 глава, отношение редукции определяется на множестве всех лямбда-термов (открытых и закрытых), которое обозначается как Λ (2 глава), множество закрытых термов обозначается как Λ⁰ — отношение редукции задаётся не на нём, хотя вполне на него сужается), что в агде:

f = λ x → let y = x in let z = x; a₁ = replicate {n = y} 1 in let a₂ = replicate {n = z} 2 in a₁ , a₂

-- C-c C-n f (i.e. normal form of `f`)
-- =>
-- λ x → replicate 1 Σ., replicate 2

f′ : (x : ℕ) → Vec ℕ x × Vec ℕ x
f′ = λ x → replicate 1 , replicate 2

-- C-c C-n f′
-- =>
-- λ x → replicate 1 Σ., replicate 2

record Proxy {A : Set} (_ : A) : Set where

check-f : Proxy f
check-f = record {}

-- C-c C-d check-f (i.e. type of `check-f`)
-- =>
-- Proxy (λ x → replicate 1 Σ., replicate 2)

check-f′ : Proxy f′
check-f′ = record {}

-- C-c C-d check-f′
-- =>
-- Proxy (λ x → replicate 1 Σ., replicate 2)

-- C-c C-n Proxy f (i.e. normal form of _type_ `Proxy f`)
-- =>
-- Proxy (λ x → replicate 1 Σ., replicate 2)

-- C-c C-n Proxy f′
-- =>
-- Proxy (λ x → replicate 1 Σ., replicate 2)

И где тут редукция?

5!≡12*10 : 5 ! ≡ 12 * 10
5!≡12*10 = refl

-- C-c C-n 5 !
-- =>
-- 120

-- C-c C-n 12 * 10
-- =>
-- 120
 
-- C-c C-d 5!≡12*10
-- =>
-- 120 ≡ 120

-- C-c C-n 5 ! ≡ 12 * 10
-- =>
-- 120 ≡ 120

Особенно во втором случае

Я уже два раза рассказывал про то как работает индукция (рекурсия) с зависимым паттерн-матчингом:

a+0≡a : ∀ a → a + 0 ≡ a
a+0≡a 0 = refl
-- 
-- Base case, a ~ 0:
-- 
-- C-c C-n 0 + 0 ≡ 0
-- =>
-- 0 ≡ 0
-- 
-- C-c C-d refl
-- =>
-- _x_76 ≡ _x_76
-- 
-- s.t. refl : 0 ≡ 0 is w.t.
-- 
a+0≡a (suc a) = cong suc (a+0≡a a)
-- 
-- Step case, a ~ suc a:
-- 
-- C-c C-n λ a → suc a + 0 ≡ suc a
-- =>
-- λ a → suc (a + 0) ≡ suc a
-- 
-- C-c C-d λ a → cong suc (a+0≡a a)
-- =>
-- (a : ℕ) → suc (a + 0) ≡ suc a
-- 
-- C-c C-n (a : ℕ) → suc (a + 0) ≡ suc a
-- =>
-- itself
-- 
-- s.t.
-- 
-- ... | suc a = cong suc (a+0≡a a) <- induction/recursion in (dep.) p.m. case.
--               ^ : a + 0 ≡ a
--               i.e. w.t. as well.

Оно есть в самом определении «статической системы типов».

Вот LF это «теория типов», а не «система типов» — ей действительно всё равно, в её абстрактных рамках индексация действительно проводится «любыми» термами, безотносительно каких-то стадий (стадий нет, есть отношения на множествах термов, типов и т.п. — где у Barendregt или Lambek & Scott стадии?), но конкретная «система типов» вместе с реальным языком с «системой эффектов» вполне могут быть построены вокруг LF так, что всё ей (LF) свойственное будет работать исключительно с constexpr типами, или «хуже» — это может быть голый пруф/тайп-чекер LF без рантайма (но с этими самыми тотальными редукциями термов в типах, считаем за CTFE) и он _будет_ реализацией «теории типов» LF.

Это не типы.

http://i.imgur.com/C3a9Bem.png — я про «types:».

More formally

Ты приводишь что я просил? То есть «Термы являются типами»?

Ну ладно, ты всё ещё говоришь про то, что индексация должна проводится «любыми термами». Я этого не понимаю.

Никакого ИО мы не рассматирваем

Ну вот и чекай concat и т.п. как в той же агде — из ИО ничего не прилетает, значит всё известно, проблем нет?

А как ты сформулируешь понятие «статически типизированный язык» если у тебя нету понятий компайлтайма и рантайма?

Но они есть — в C++/D/Agda. Как и редукции термов в типах. В Agda можно считать, что compile-time это проверка типов (с тотальными редукциями), потом (тотальное же) вычисление нормальных форм, в том числе терма main типа IO T, а runtime это интерпретация этого терма main самим RTS (с частичными вычислениями).

но тогда ВАЖНО когда происходят редукции, а когда - тайпчек

А когда происходит вычисление constexpr функций в C++? Или CTFE в D?

пишется в простой типизированной лямбде

Этого тоже не понимаю. Вот в Haskell 2010 не пишется — пробовали же вроде тут.

Что такое эти квалификаторы? Явно не типы. И не кайнды. И вообще у тебя не получится сформулировать корректную систему типов с такими квалификаторами.

Квалификаторы это проблема, вообще-то — следствие отсутствия системы эффектов / patriality (раз мы хотим вычисления в compile-time, нужно как-то отражать тотальность, аналогично чистоте) в языке, а с ними всё уже вполне формулируется (грубо говоря constexpr T -> T; T const[&] -> IO T; T[&] -> IO (Ref T), снаружи IO/Partiality у нас применимо CTFE).

Ничем не проще.

http://en.wikipedia.org/wiki/System_F#System_F.CF.89

Исправление quasimoto, :

Очевидно, что не нужно, т.к. редуцировать их нельзя.

Можно — что в обычном лямбда исчислении (см. Barendregt — 3 глава, отношение редукции определяется на множестве всех лямбда-термов (открытых и закрытых), которое обозначается как Λ (2 глава), множество закрытых термов обозначается как Λ⁰ — отношение редукции задаётся не на нём, хотя вполне на него сужается), что в агде:

f = λ x → let y = x in let z = x; a₁ = replicate {n = y} 1 in let a₂ = replicate {n = z} 2 in a₁ , a₂

-- C-c C-n f (i.e. normal form of `f`)
-- =>
-- λ x → replicate 1 Σ., replicate 2

f′ : (x : ℕ) → Vec ℕ x × Vec ℕ x
f′ = λ x → replicate 1 , replicate 2

-- C-c C-n f′
-- =>
-- λ x → replicate 1 Σ., replicate 2

record Proxy {A : Set} (_ : A) : Set where

check-f : Proxy f
check-f = record {}

-- C-c C-d check-f (i.e. type of `check-f`)
-- =>
-- Proxy (λ x → replicate 1 Σ., replicate 2)

check-f′ : Proxy f′
check-f′ = record {}

-- C-c C-d check-f′
-- =>
-- Proxy (λ x → replicate 1 Σ., replicate 2)

-- C-c C-n Proxy f (i.e. normal form of _type_ `Proxy f`)
-- =>
-- Proxy (λ x → replicate 1 Σ., replicate 2)

-- C-c C-n Proxy f′
-- =>
-- Proxy (λ x → replicate 1 Σ., replicate 2)

И где тут редукция?

5!≡12*10 : 5 ! ≡ 12 * 10
5!≡12*10 = refl

-- C-c C-n 5 !
-- =>
-- 120

-- C-c C-n 12 * 10
-- =>
-- 120
 
-- C-c C-d 5!≡12*10
-- =>
-- 120 ≡ 120

-- C-c C-n 5 ! ≡ 12 * 10
-- =>
-- 120 ≡ 120

Особенно во втором случае

Я уже два раза рассказывал про то как работает индукция (рекурсия) с зависимым паттерн-матчингом:

a+0≡a : ∀ a → a + 0 ≡ a
a+0≡a 0 = refl
-- 
-- Base case, a ~ 0:
-- 
-- C-c C-n 0 + 0 ≡ 0
-- =>
-- 0 ≡ 0
-- 
-- C-c C-d refl
-- =>
-- _x_76 ≡ _x_76
-- 
-- s.t. refl : 0 ≡ 0 is w.t.
-- 
a+0≡a (suc a) = cong suc (a+0≡a a)
-- 
-- Step case, a ~ suc a:
-- 
-- C-c C-d λ a → cong suc (a+0≡a a)
-- =>
-- (a : ℕ) → suc (a + 0) ≡ suc a
-- 
-- C-c C-n (a : ℕ) → suc (a + 0) ≡ suc a
-- =>
-- itself
-- 
-- s.t.
-- 
-- ... | suc a = cong suc (a+0≡a a) <- induction/recursion in (dep.) p.m. case.
--               ^ : a + 0 ≡ a
--               i.e. w.t. as well.

Оно есть в самом определении «статической системы типов».

Вот LF это «теория типов», а не «система типов» — ей действительно всё равно, в её абстрактных рамках индексация действительно проводится «любыми» термами, безотносительно каких-то стадий (стадий нет, есть отношения на множествах термов, типов и т.п. — где у Barendregt или Lambek & Scott стадии?), но конкретная «система типов» вместе с реальным языком с «системой эффектов» вполне могут быть построены вокруг LF так, что всё ей (LF) свойственное будет работать исключительно с constexpr типами, или «хуже» — это может быть голый пруф/тайп-чекер LF без рантайма (но с этими самыми тотальными редукциями термов в типах, считаем за CTFE) и он _будет_ реализацией «теории типов» LF.

Это не типы.

http://i.imgur.com/C3a9Bem.png — я про «types:».

More formally

Ты приводишь что я просил? То есть «Термы являются типами»?

Ну ладно, ты всё ещё говоришь про то, что индексация должна проводится «любыми термами». Я этого не понимаю.

Никакого ИО мы не рассматирваем

Ну вот и чекай concat и т.п. как в той же агде — из ИО ничего не прилетает, значит всё известно, проблем нет?

А как ты сформулируешь понятие «статически типизированный язык» если у тебя нету понятий компайлтайма и рантайма?

Но они есть — в C++/D/Agda. Как и редукции термов в типах. В Agda можно считать, что compile-time это проверка типов (с тотальными редукциями), потом (тотальное же) вычисление нормальных форм, в том числе терма main типа IO T, а runtime это интерпретация этого терма main самим RTS (с частичными вычислениями).

но тогда ВАЖНО когда происходят редукции, а когда - тайпчек

А когда происходит вычисление constexpr функций в C++? Или CTFE в D?

пишется в простой типизированной лямбде

Этого тоже не понимаю. Вот в Haskell 2010 не пишется — пробовали же вроде тут.

Что такое эти квалификаторы? Явно не типы. И не кайнды. И вообще у тебя не получится сформулировать корректную систему типов с такими квалификаторами.

Квалификаторы это проблема, вообще-то — следствие отсутствия системы эффектов / patriality (раз мы хотим вычисления в compile-time, нужно как-то отражать тотальность, аналогично чистоте) в языке, а с ними всё уже вполне формулируется (грубо говоря constexpr T -> T; T const[&] -> IO T; T[&] -> IO (Ref T), снаружи IO/Partiality у нас применимо CTFE).

Ничем не проще.

http://en.wikipedia.org/wiki/System_F#System_F.CF.89

Исходная версия quasimoto, :

Очевидно, что не нужно, т.к. редуцировать их нельзя.

Можно — что в обычном лямбда исчислении (см. Barendregt — 3 глава, отношение редукции определяется на множестве всех лямбда-термов (открытых и закрытых), которое обозначается как Λ (2 глава), множество закрытых термов обозначается как Λ⁰ — отношение редукции задаётся не на нём, хотя вполне на него сужается), что в агде:

f = λ x → let y = x in let z = x; a₁ = replicate {n = y} 1 in let a₂ = replicate {n = z} 2 in a₁ , a₂

-- C-c C-n f (i.e. normal form of `f`)
-- =>
-- λ x → replicate 1 Σ., replicate 2

f′ : (x : ℕ) → Vec ℕ x × Vec ℕ x
f′ = λ x → replicate 1 , replicate 2

-- C-c C-n f′
-- =>
-- λ x → replicate 1 Σ., replicate 2

record Proxy {A : Set} (_ : A) : Set where

check-f : Proxy f
check-f = record {}

-- C-c C-d check-f (i.e. type of `check-f`)
-- =>
-- Proxy (λ x → replicate 1 Σ., replicate 2)

check-f′ : Proxy f′
check-f′ = record {}

-- C-c C-d check-f′
-- =>
-- Proxy (λ x → replicate 1 Σ., replicate 2)

-- C-c C-n Proxy f (i.e. normal form of _type_ `Proxy f`)
-- =>
-- Proxy (λ x → replicate 1 Σ., replicate 2)

-- C-c C-n Proxy f′
-- =>
-- Proxy (λ x → replicate 1 Σ., replicate 2)

И где тут редукция?

5!≡12*10 : 5 ! ≡ 12 * 10
5!≡12*10 = refl

-- C-c C-n 5 !
-- =>
-- 120

-- C-c C-n 12 * 10
-- =>
-- 120
 
-- C-c C-d 5!≡12*10
-- =>
-- 120 ≡ 120

-- C-c C-n 5 ! ≡ 12 * 10
-- =>
-- 120 ≡ 120

Особенно во втором случае

Я уже два раза рассказывал про то как работает индукция (рекурсия) с зависимым паттерн-матчингом:

a+0≡a : ∀ a → a + 0 ≡ a
a+0≡a 0 = refl
-- 
-- Base case, a ~ 0:
-- 
-- C-c C-n 0 + 0 ≡ 0
-- =>
-- 0 ≡ 0
-- 
-- C-c C-d refl
-- =>
-- _x_76 ≡ _x_76
-- 
-- s.t. refl : 0 ≡ 0 is w.t.
-- 
a+0≡a (suc a) = cong suc (a+0≡a a)
-- 
-- Step case, a ~ suc a:
-- 
-- C-c C-d λ a → cong suc (a+0≡a a)
-- =>
-- (a : ℕ) → suc (a + 0) ≡ suc a
-- 
-- C-c C-n (a : ℕ) → suc (a + 0) ≡ suc a
-- =>
-- itself
-- 
-- s.t.
-- 
-- ... | suc a = cong suc (a+0≡a a) <- induction/recursion in (dep.) p.m. case.
--               ^ : a + 0 ≡ a
--               i.e. w.t. as well.

Оно есть в самом определении «статической системы типов».

Вот LF это «теория типов», а не «система типов» — ей действительно всё равно, в её абстрактных рамках индексация действительно проводится «любыми» термами, безотносительно каких-то стадий (стадий нет, есть отношения на множествах термов, типов и т.п. — где у Barendregt или Lambek & Scott стадии?), но конкретная «система типов» вместе с реальным языком с «системой эффектов» вполне могут быть построены вокруг LF так, что всё ей (LF) свойственное будет работает исключительно с constexpr типами, или «хуже» — это может быть голый пруф/тайп-чекер LF без рантайма (но с этими самыми тотальными редукциями термов в типах, считаем за CTFE) и он _будет_ реализацией «теории типов» LF.

Это не типы.

http://i.imgur.com/C3a9Bem.png — я про «types:».

More formally

Ты приводишь что я просил? То есть «Термы являются типами»?

Ну ладно, ты всё ещё говоришь про то, что индексация должна проводится «любыми термами». Я этого не понимаю.

Никакого ИО мы не рассматирваем

Ну вот и чекай concat и т.п. как в той же агде — из ИО ничего не прилетает, значит всё известно, проблем нет?

А как ты сформулируешь понятие «статически типизированный язык» если у тебя нету понятий компайлтайма и рантайма?

Но они есть — в C++/D/Agda. Как и редукции термов в типах. В Agda можно считать, что compile-time это проверка типов (с тотальными редукциями), потом (тотальное же) вычисление нормальных форм, в том числе терма main типа IO T, а runtime это интерпретация этого терма main самим RTS (с частичными вычислениями).

но тогда ВАЖНО когда происходят редукции, а когда - тайпчек

А когда происходит вычисление constexpr функций в C++? Или CTFE в D?

пишется в простой типизированной лямбде

Этого тоже не понимаю. Вот в Haskell 2010 не пишется — пробовали же вроде тут.

Что такое эти квалификаторы? Явно не типы. И не кайнды. И вообще у тебя не получится сформулировать корректную систему типов с такими квалификаторами.

Квалификаторы это проблема, вообще-то — следствие отсутствия системы эффектов / patriality (раз мы хотим вычисления в compile-time, нужно как-то отражать тотальность, аналогично чистоте) в языке, а с ними всё уже вполне формулируется (грубо говоря constexpr T -> T; T const[&] -> IO T; T[&] -> IO (Ref T), снаружи IO/Partiality у нас применимо CTFE).

Ничем не проще.

http://en.wikipedia.org/wiki/System_F#System_F.CF.89