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-11 05:11 pm (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
кажется просто (λx.xx)
(deleted comment)

Date: 2012-10-11 05:21 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Не имеет, поэтому х-ль и ненавидит такое :)
(deleted comment)

Date: 2012-10-11 05:41 pm (UTC)
From: [identity profile] metaclass.livejournal.com
В кложуре неленивый порядок.
(deleted comment)

Date: 2012-10-11 05:48 pm (UTC)
From: [identity profile] metaclass.livejournal.com
А, так это у них секвенсы и прочая итерация ленивые. И некоторые функции, типа concat, на чем можно неплохо обжечься.
Во всяких F#/C# ленивость такая же - все энергичное, а итераторы ленивые.

Date: 2012-10-11 05:46 pm (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
вроде бы в λ2(𝕋) возможно

Date: 2012-10-11 06:50 pm (UTC)
From: [identity profile] gds.livejournal.com
в просто-типизированном -- не типизируется, конечно.
Но можно и похитрее типы взять для лямбда-исчисления.
$ ocaml
        Objective Caml version 3.12.1+rc1

# ((fun x -> (x x)) (fun x -> (x x)));;
Error: This expression has type 'a -> 'b
       but an expression was expected of type 'a
# #rectypes;;   <-----  magic here
# ((fun x -> (x x)) (fun x -> (x x)));;
^CInterrupted.
# let f () = ((fun x -> (x x)) (fun x -> (x x)));;
val f : unit -> 'a = <fun>
# fun x -> x x;;
- : ('a -> 'b as 'a) -> 'b = <fun>
# 

Date: 2012-10-12 11:49 am (UTC)
From: [identity profile] potan.livejournal.com
Смотря как тимизированном. К OCaml можно подобрать опции, что он такое откомпилирует.

Date: 2012-10-11 07:53 pm (UTC)
From: [identity profile] lomeo.livejournal.com
В статических можно эмулировать с помощью изоморфных типов. Например, определив тип
newtype F a = F (F a → a)

мы получили тип изоморфный F a → a, т.е. тип, который можно применять к себе. А значит можем написать \x → x x как \(F f) → f (F f)), а полный Y-комбинатор как
y = (\(F f) → f (F f)) (F (\(F f) → f (F f)))

Date: 2012-10-11 07:54 pm (UTC)
From: [identity profile] lomeo.livejournal.com
Главное — не пытаться прочесть это вслух! :-)

Date: 2012-10-12 05:33 am (UTC)
From: [identity profile] nivanych.livejournal.com
Надо перевести на латынь.

Date: 2012-10-12 08:32 am (UTC)
From: [identity profile] permea-kra.livejournal.com
Prelude> :t let f x = x . f x in f
let f x = x . f x in f :: (b -> b) -> a -> b

Date: 2012-10-12 02:28 pm (UTC)
From: [identity profile] migmit.livejournal.com
Гы. Мой любимый Perl-like Haskell:
newtype Y a = Y {(|$) :: Y a -> a}
y = let z w f = f $ (w |$ w) f in Y z |$ Y z 

Y-комбинатор. Без скрытых fix-ов.

Date: 2012-10-13 12:32 pm (UTC)
From: [identity profile] miserakl.livejournal.com
> Без скрытых fix-ов.
Да ладно. Просто они в конструкторы типов спрятаны.
В хаскеле же типы эквирекурсивные.

Date: 2012-10-13 12:40 pm (UTC)
From: [identity profile] migmit.livejournal.com
> Просто они в конструкторы типов спрятаны.

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

Date: 2012-10-13 02:15 pm (UTC)
From: [identity profile] miserakl.livejournal.com
Если стереть типы, то да. Но вообще-то у нас тут рекурсивный тип, и в каждое применение конструктора или сопоставление с образцом зашито явное применение изоморфизма между рекурсивным типом и его одношаговой развёрткой. Этот изоморфизм мы не смогли бы построить сами, если бы компилятор не умел делать вид, что он существует.

Date: 2012-10-13 02:23 pm (UTC)
From: [identity profile] miserakl.livejournal.com
* Прошу прощения, это как раз называется изорекурсивные типы, а не экви-.

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 04:28 pm
Powered by Dreamwidth Studios