Интересно, типа.
Feb. 3rd, 2013 10:33 pmВот есть, типа, такая типа штука, называется типа "зависимые типы". Когда сам тип содержит в себе значение. И два таких типа будут (типа) совместимы, если эти значения равны. А поскольку значения будут известны только в рантайме, приходится давать доказательство того, что значения таки равны.
А вот во всяких джавах с сиплюсплюсами равенств как минимум два. Не помню точно, как они называются, но, в общем, равенство по ссылке и по значению. Первое сильнее второго. То есть, если какие-то штуки лежат в одном и том же месте, то это одна и та же штука, и, значит, они одинаковые. Но если они одинаковые — это ещё не значит, что они лежат в одном и том же месте.
В агде, если мой эклер меня не обманывает, требуется равенство по значению. А есть ли зависимые типы с равенством по ссылке? То есть, для того, чтобы
Такое где-нибудь есть?
Update: подсказали, что это, вроде, называется "path dependent types".
А вот во всяких джавах с сиплюсплюсами равенств как минимум два. Не помню точно, как они называются, но, в общем, равенство по ссылке и по значению. Первое сильнее второго. То есть, если какие-то штуки лежат в одном и том же месте, то это одна и та же штука, и, значит, они одинаковые. Но если они одинаковые — это ещё не значит, что они лежат в одном и том же месте.
В агде, если мой эклер меня не обманывает, требуется равенство по значению. А есть ли зависимые типы с равенством по ссылке? То есть, для того, чтобы
Vector n Int был тем же типом, что и Vector m Int нужно не только n=m, нужно, чтобы n и m были одной и той же переменной.Такое где-нибудь есть?
Update: подсказали, что это, вроде, называется "path dependent types".
no subject
Date: 2013-02-03 11:47 pm (UTC)Бывают еще nominal path dependent types, там для равенства совпасть должно лишь место определения в коде, они эмулируются через экзистенциальные типы.
no subject
Date: 2013-02-04 04:29 am (UTC)Э-э-э, почему runtime-то?
> Могут быть реализованы в языках с зависимыми типами
Defeats the purpose.
> они эмулируются через экзистенциальные типы.
КАК?
no subject
Date: 2013-02-04 08:09 pm (UTC)no subject
Date: 2013-02-04 08:14 pm (UTC)А как быть с вариантом про "совпадение места определения переменной"?
no subject
Date: 2013-02-04 08:16 pm (UTC)Он в целом оказался ущербным и нигде кроме toy models не применяется.
no subject
Date: 2013-02-04 08:24 pm (UTC)no subject
Date: 2013-02-04 08:28 pm (UTC)no subject
Date: 2013-02-04 08:15 pm (UTC)Предположим, у нас есть тип Canvas, у объектов которого есть внутренний тип Point. (Чтобы сравнивать точки с разных холстов было невозможно, системы координат-то разное, а стало быть сравнение бессмысленное.)
Возьмём выражение val a = new Canvas; println([a.Point] == [a.Point]). Оно выдаст true. А если подставить, то выйдет println([(new Canvas).Point] == [(new Canvas).Point]), будет false. Исчисление с путезависимыми типами по-сути линейное, дупликация в нём только в явном виде допустима.
no subject
Date: 2013-02-04 08:24 pm (UTC)no subject
Date: 2013-02-04 08:31 pm (UTC)no subject
Date: 2013-02-07 11:03 pm (UTC)очень интересно взглянуть на эту "кучу"
по-моему как раз пофиг, т.к. new Canvas -- это считай такая нечистая функция, скажем new_canvas(), которая каждый раз выдает разные значения -- и что это может развалить (вне контекста х-я конечно)?
no subject
Date: 2013-02-08 04:36 am (UTC)no subject
Date: 2013-02-07 11:21 pm (UTC)no subject
Date: 2013-02-04 08:33 pm (UTC)x.type, гдеx— переменная.no subject
Date: 2013-02-04 08:34 pm (UTC)no subject
Date: 2013-02-07 10:44 pm (UTC)может расскажешь? особенно интересно, что сломают в хаскеле наивные PDT?
no subject
Date: 2013-02-08 03:43 am (UTC)no subject
Date: 2013-02-07 11:15 pm (UTC)в реальном мире уже сам по себе факт, что мы может назвать одно х, а другое у, говорит о том, что они чем-то отличаются; возможно, конечно, что они отличаются только путем доступа, но (опять я скатываюсь на роль к.о.) нельзя 2 раза войти в одну реку (разным путем, гы-гы)
а еще я думаю, что часто Canvas будет определятся так, чтобы new_canvas().Y == new_canvas().Y, и проблемы нет
no subject
Date: 2013-02-07 11:25 pm (UTC)и если компилятору удается доказать, что от одного момента до другого втихую не была вызвана change_Y_to_Z(), то получаем PDT, а иначе программисту придется доказывать или вынести проверку c1.Y==c2.Y в рантайм, где в случае чего кидать исключение
no subject
Date: 2013-02-07 11:37 pm (UTC)но что действительно интересно -- что нечистота (а это она, родимая) может сломать в тайпклассах?