metaclass: (Default)
[personal profile] metaclass
(#(% %) #(% %)) - StackOverflow на кложуре
((fn [x] (x x)) (fn [x] (x x))) - StackOverflow на кложуре (более явная запись предущего)
на хаскеле даже на \x -> x x сразу ругается тайпчекер

(λx.xx)(λx.xx) - это оно же?

Date: 2012-10-13 12:40 pm (UTC)
From: [identity profile] migmit.livejournal.com
А в случае newtype-ов конструктор вообще укомпиляется в ноль.

Date: 2012-10-13 02:16 pm (UTC)
From: [identity profile] miserakl.livejournal.com
При чём тут компиляция. Речь о семантике.

При компиляции и let a = 1 : a никаких фиксов не содержит.

Date: 2012-10-13 04:48 pm (UTC)
From: [identity profile] migmit.livejournal.com
> При чём тут компиляция. Речь о семантике.

Ну да. А семантика конструктора типов — тривиальнейшая.

> Этот изоморфизм мы не смогли бы построить сами, если бы компилятор не умел делать вид, что он существует.

Почему делать вид-то? Тип ОПРЕДЕЛЁН так, чтобы этот изоморфизм существовал. И я не понимаю, что значит "построить": он есть по определению типа.

Date: 2012-10-14 02:54 pm (UTC)
From: [identity profile] miserakl.livejournal.com
Вы используете не только тривиальную семантику конструкторов как навешивание бирок, но и рекурсию на типах, то есть неявно вызываете "комбинатор неподвижной точки на уровне типов". И после этого говорите, что никаких fix не было; читерство же!

Вы можете возразить, что в денотационной семантике ваше выражение нигде не использует fix (который переход к точной верхней грани последовательности всё более определённых выражений). Но это лишь потому, что вы отложили его до момента, когда надо будет вычислять применение функции к конкретному значению.

Впрочем, ведь и Data.Function.fix тоже откладывает этот момент, только он использует явную рекурсию через let (примитив языка), а Ваш вариант — явную рекурсию на типах (тоже встроенную в язык), но поскольку она делается в другой строчке, то якобы её не было :)

Date: 2012-10-14 03:43 pm (UTC)
From: [identity profile] migmit.livejournal.com
> вызываете "комбинатор неподвижной точки на уровне типов". И после этого говорите, что никаких fix не было

Конечно. fix — он на уровне значений.

> Но это лишь потому, что вы отложили его до момента, когда надо будет вычислять применение функции к конкретному значению.

Чего-чего? Это что я куда отложил?

Date: 2012-10-20 12:26 pm (UTC)
From: [identity profile] miserakl.livejournal.com
Ну если говорить только о значениях и закрыть глаза на типы, то конечно :)

Я вообще предполагал, по совету (http://nponeccop.livejournal.com/287952.html?thread=2373840#t2373840) [livejournal.com profile] nponeccop, что речь идёт о денотационной семантике.
С ней дело не настолько чисто.

Давайте для простоты забудем о полиморфизме и посмотрим с точки зрения наивной теоретико-множественной интерпретации. Пока мы говорим о нерекурсивных типах, то всё понятно: это действительно навешивание бирок для размеченных объединений, построение кортежей и функциональные типы. Есть примитивные операции: аппликация, проекции, вложения, предикаты (сравнения конструкторов) — с понятным теоретико-множественным смыслом, и когда мы комбинируем эти операции, мы получаем простые функции, которые можно целиком определить, разбив область определения на конечное число областей и на каждой из них задав результат только с помощью аппликаций.

В частности, покуда мы не разрешаем рекурсивные типы, если композиция двух функций в какой-то точке вычисляется в _|_, то одна из двух исходных в соответствующем месте вычисляется в _|_ (simply typed гарантирует завершимость).

Что происходит при наличии рекурсивных типов? Теперь оказывается, что комбинацией примитивных операций можно получить рекурсивную функцию, которую нельзя задать в денотационной семантике явным уравнением ("на первом куске вот такое правило, на втором вот такое, всего кусков эн"), а только задать как предел последовательности итераций. Вы сами привели пример.
В частности, _|_ теперь может возникнуть не только оттого, что кто-то явно вернул undefined, но и из-за зацикливания.

Собственно, я на то и хотел обратить внимание:
1) хотя Вы и определили y в терминах только применение одних элементарных термов к другим, теоретико-множественная интерпретация этой функции рекурсивна;
2) это происходит потому, что для (некоторых) рекурсивных типов денотационная семантика банальной аппликации существенно использует рекурсию (внезапно).

PS. Это всё, строго говоря, не про хаскел, так как у него нет интерпретации в категории Set.
Ден. семантику для хаскела я не знаю — кстати, буду благодарен, если Вы посоветуете почитать что-нибудь, — но ожидаю увидеть в ней то же явление.
Edited Date: 2012-10-20 12:26 pm (UTC)

Date: 2012-10-20 01:44 pm (UTC)
From: [identity profile] migmit.livejournal.com
> Я вообще предполагал, по совету nponeccop, что речь идёт о денотационной семантике.
С ней дело не настолько чисто.

С ней, как раз, всё кристально чисто.

> Давайте для простоты забудем о полиморфизме и посмотрим с точки зрения наивной теоретико-множественной интерпретации.

Нет, вот этого не надо. "Наивная теоретико-множественная интерпретация" — прямой путь в ад. Давайте по-нормальному: семантика Скотта и подходящая категория частично-упорядоченных множеств.

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

Во-первых, я не вполне понимаю, что вы подразумеваете под "явлением".

Во-вторых, что конкретно почитать — не скажу, но гуглить надо семантику Скотта, теорию доменов, потом ещё, если будет настроение, найти такую вещь как "dI-domains" (вторая буква — заглавная "i", на всякий пожарный).

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 24th, 2025 09:41 pm
Powered by Dreamwidth Studios