migmit: (Default)
[personal profile] migmit
Вот есть, типа, такая типа штука, называется типа "зависимые типы". Когда сам тип содержит в себе значение. И два таких типа будут (типа) совместимы, если эти значения равны. А поскольку значения будут известны только в рантайме, приходится давать доказательство того, что значения таки равны.

А вот во всяких джавах с сиплюсплюсами равенств как минимум два. Не помню точно, как они называются, но, в общем, равенство по ссылке и по значению. Первое сильнее второго. То есть, если какие-то штуки лежат в одном и том же месте, то это одна и та же штука, и, значит, они одинаковые. Но если они одинаковые — это ещё не значит, что они лежат в одном и том же месте.

В агде, если мой эклер меня не обманывает, требуется равенство по значению. А есть ли зависимые типы с равенством по ссылке? То есть, для того, чтобы Vector n Int был тем же типом, что и Vector m Int нужно не только n=m, нужно, чтобы n и m были одной и той же переменной.

Такое где-нибудь есть?

Update: подсказали, что это, вроде, называется "path dependent types".
Page 1 of 3 << [1] [2] [3] >>

Date: 2013-02-03 06:49 pm (UTC)
From: [identity profile] krlz.livejournal.com
В функциональных языках не может в принципе быть равенства по ссылке. У нас же referential transparency.

Date: 2013-02-03 07:23 pm (UTC)
From: [identity profile] deni-ok.livejournal.com
Это сузит пространство возможностей.
(++) : Vec A n -> Vec A m -> Vec A (n + m)
Конкатенируя Vec A 3 и Vec A 4 мы получим Vec A 7, только эта семёрка гарантировано не будет ссылочно равна никакой другой семёрке.

Date: 2013-02-03 07:28 pm (UTC)
From: [identity profile] nealar.livejournal.com
Vector (IORef n) Int ?

Зависимые типы

Date: 2013-02-03 07:30 pm (UTC)
From: [identity profile] livejournal.livejournal.com
User [livejournal.com profile] nponeccop referenced to your post from Зависимые типы (http://nponeccop.livejournal.com/316607.html) saying: [...] В связи с [...]

Date: 2013-02-03 07:40 pm (UTC)
From: [identity profile] zhengxi.livejournal.com
внутренние классы в скале ?

Date: 2013-02-03 07:47 pm (UTC)
From: [identity profile] migmit.livejournal.com
Это какой-то сферический язык в вакууме. В Хаскеле, например, есть IORef-ы.

Date: 2013-02-03 07:55 pm (UTC)
From: [identity profile] migmit.livejournal.com
Конечно, сузит. С другой стороны, возможно, это позволит получить некоторые плюшки зависимых типов, не нагружая программиста доказательствами. Т.е., доказательства сведутся к синтаксической проверке.

Я имею в виду плюшки такого типа:
data Ord a = Ord {compare :: a -> a -> Ordering}
data Set a (Ord a) = какая-то реализация
ordInt :: Ord Int
ordInt = Ord {compare = compareInt#}
a :: Set a ordInt
...
ordIntFake :: Ord Int
ordIntFake = Ord {compare = flip compare ordInt}

Ни в каком случае a не будет воспринято как Set a ordIntFake. Система классов и инстансов в Хаскеле этого не обеспечивает — можно описать разные инстансы в разных модулях и закрутить всё так, что они не станут друг другу мешать; в результате вполне можно получить, например, Set, содержащий какое-то значение несколько раз. Если же запихивать значение внутрь Set-а, то будет сложно делать union, например. А так — всё хорошо.

Date: 2013-02-03 07:57 pm (UTC)
From: [identity profile] migmit.livejournal.com
Не понял, это имеется в виду какой-то существующий язык?

Date: 2013-02-03 07:59 pm (UTC)
From: [identity profile] migmit.livejournal.com
Ха, забавно, очень похоже на правду.

Date: 2013-02-03 08:01 pm (UTC)
From: [identity profile] krlz.livejournal.com
Ну да, но есть же Eq IORef a, так что сравнения по ссылкам все равно нет.

Date: 2013-02-03 08:04 pm (UTC)
From: [identity profile] krlz.livejournal.com
Имеются ввиду path dependent types? Так это просто разновидность dependent types.

Date: 2013-02-03 08:10 pm (UTC)
From: [identity profile] migmit.livejournal.com
Не понял. Это и есть сравнение по ссылкам.

Date: 2013-02-03 08:11 pm (UTC)
From: [identity profile] migmit.livejournal.com
Так я не спорю, что разновидность.

Date: 2013-02-03 08:14 pm (UTC)
ext_659502: (полосатая свинья)
From: [identity profile] some41.livejournal.com
даже без IORef есть stable names: http://www.haskell.org/ghc/docs/latest/html/libraries/base/System-Mem-StableName.html

Date: 2013-02-03 08:21 pm (UTC)
From: [identity profile] krlz.livejournal.com
Ну так на уровне типов это работать то не будет.

Date: 2013-02-03 08:23 pm (UTC)
ext_659502: (полосатая свинья)
From: [identity profile] some41.livejournal.com
что именно не будет работать? использование stable name в типе в хаскеле? так в хаскеле вообще dependent types нет

Date: 2013-02-03 09:04 pm (UTC)
From: [identity profile] migmit.livejournal.com
Хотя почитал тут — больше похоже на такие расширенные existentials, чем на dependent types.

Date: 2013-02-03 09:10 pm (UTC)
From: [identity profile] jakobz.livejournal.com
Ну что-то типа этого есть: http://www.haskell.org/ghc/docs/latest/html/libraries/base/System-Mem-StableName.html

Глупо было бы не иметь бесплатного "точно равно, т.к. физически указатели на один и тот же объект".

Date: 2013-02-03 09:40 pm (UTC)
From: [identity profile] krlz.livejournal.com
Там можно писать что-то вроде:
val x = ...
val y: x.T = ...

те мы можем ссылаться на type member-ы pure value-ов, и тип у нас реально зависит от значения

Date: 2013-02-03 09:42 pm (UTC)
From: [identity profile] krlz.livejournal.com
Но это не полноценные dependent type-ы как в агде конечно. Реально у нас есть только dependent function types, а dependent products на скале не выразить (я не знаю как по крайней мере).
def xyz(a: BBB): a.T = {...}

Date: 2013-02-03 10:20 pm (UTC)
From: [identity profile] nealar.livejournal.com
Это имеется в виду несуществующий тип Vector. Который надо привинтить к существующему языку.

Date: 2013-02-03 11:47 pm (UTC)
ext_615659: (Свечка и валокардин)
From: [identity profile] akuklev.livejournal.com
Это называется runtime path dependent types. Могут быть реализованы в языках с зависимыми типами и individual types aka entities, т.е. “ран-тайм метками, равными только самим себе: совпасть должно не только место определения в коде, но и тред/момент создания”. Нужен оператор new, создающий такую метку, и процедуры использующие этот оператор — уже не чистые функции, результат их повторного выполнения с теми же аргументами отличается от исходного. Ещё можно красиво обобщить монады State и IO, так, чтобы там допустимо было использовать оператор new, тогда и только тогда, когда созданные объекты пихаются в состояние или вывод, а возвращаемое значение при одинаковых аргуменах одинаковое.

Бывают еще nominal path dependent types, там для равенства совпасть должно лишь место определения в коде, они эмулируются через экзистенциальные типы.

Date: 2013-02-04 04:22 am (UTC)
From: [identity profile] migmit.livejournal.com
Не от значения, а от ссылки. Потому что, если я правильно понимаю, возможно, что x == y, но x.T и y.T не совместимы.

Date: 2013-02-04 04:29 am (UTC)
From: [identity profile] migmit.livejournal.com
> Это называется runtime path dependent types.

Э-э-э, почему runtime-то?

> Могут быть реализованы в языках с зависимыми типами

Defeats the purpose.

> они эмулируются через экзистенциальные типы.

КАК?

Date: 2013-02-04 04:46 am (UTC)
From: [identity profile] migmit.livejournal.com
То есть, если я правильно понял, происходит примерно следующее: для каждой переменной x создаётся новый тип x.type, который наследует все поля и методы того типа, который для x объявлен; внутренние типы становятся его членами.
Page 1 of 3 << [1] [2] [3] >>