Типы и типы
Feb. 24th, 2012 10:44 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Очевидно ли, почему flatten и (partial apply concat) в Clojure могут выдать разные результаты? После хаскеля кложурный flatten, работающий на все уровни "вглубь", выглядит непривычно.
По ходу, статическая типизация делает невозможными некоторые типы программ, возможные при динамической.
Соответственно, наиболее заебатая статическая типизация, с какими-нибудь адскими зависимыми типами, должна делать невозможными еще большее количество программ.
А самая правильная типизация - это при которой множество допустимых программ пустое.
По ходу, статическая типизация делает невозможными некоторые типы программ, возможные при динамической.
Соответственно, наиболее заебатая статическая типизация, с какими-нибудь адскими зависимыми типами, должна делать невозможными еще большее количество программ.
А самая правильная типизация - это при которой множество допустимых программ пустое.
no subject
Date: 2012-02-24 07:52 am (UTC)no subject
Date: 2012-02-24 07:55 am (UTC)no subject
Date: 2012-02-24 08:00 am (UTC)Нет, просто приходится вручную описывать все варианты, что в динамике даются на халяву. Таким образом, функция объема статического кода от динамического, - как минимум, степенная.
Путем наворачивания крутых статических типов можно довести объем статического кода до динамического.
Т.е. в пределе крутой статический код это простой динамический.
no subject
Date: 2012-02-24 08:30 am (UTC)Функция стоимости же...
no subject
Date: 2012-02-24 08:43 pm (UTC)no subject
Date: 2012-02-24 09:39 pm (UTC)no subject
Date: 2012-02-24 09:44 pm (UTC)no subject
Date: 2012-02-24 09:53 pm (UTC)no subject
Date: 2012-02-24 08:14 am (UTC)Это тянет на теорему. Какие например типы?
no subject
Date: 2012-02-24 08:29 am (UTC)И к заявлениям
no subject
Date: 2012-02-24 08:36 am (UTC)charAt s i = s.[i]
по идее, никакая статическая типизация не поможет доказать, что эта функция не кинет исключения при выходе за пределы массива.
Т.е. программа то остается возможной, но все равно придется ее прогонять через юнит-тесты, и статическая типизация не поможет от них избавится.
no subject
Date: 2012-02-24 09:05 am (UTC)Кстати, пример с корректной адресацией элементов массива идёт не то первым, не то вторым примером в какой-то из статей про Эпиграм. Вот трансляция оттуда в Хаскель по памяти:
no subject
Date: 2012-02-24 09:18 am (UTC)Т.е. если мы вводим s пользователем, то полный тип программы выведется только после ввода строки, или не выведется, потому что пользователь ввел "a" а мы обращаемся ко второму символу.
Соответственно, вместо обработки исключений в рантайме у нас вывод типов в рантайме, причем нужно еще куда-то сунуть локализуемое сообщение об ошибке, чтобы его показать пользователю.
Это можно сделать на зависимых типах?
no subject
Date: 2012-02-24 09:31 am (UTC)Нет.
Вычислительная часть программы требует некоторых гарантий, и в той части программы, что занимается вводом данных мы должны произвести необходимые действия для проверки гарантий.
Гарантии указаны в типе. Контракте, если изволите.
Нарушение контракта можно переводить в сообщение об ошибке.
no subject
Date: 2012-02-24 09:40 am (UTC)no subject
Date: 2012-02-24 09:50 am (UTC)no subject
Date: 2012-02-24 10:06 am (UTC)no subject
Date: 2012-02-24 01:56 pm (UTC)не то?
no subject
Date: 2012-02-24 03:55 pm (UTC)http://thedeemon.livejournal.com/41035.html
no subject
Date: 2012-02-24 08:34 am (UTC)А когда дело доходит до того, что кроме json нужно отдать еще и html/xml/csv как положено RESTful сервису, сигнатуры типов начинают рыдать кровавыми слезами.
no subject
Date: 2012-02-24 09:32 am (UTC)И типы в порядке, и динамичность есть.
no subject
Date: 2012-02-24 03:52 pm (UTC)no subject
Date: 2012-02-24 09:17 am (UTC)имхо основное практическое удовольствие хаскеля в алгебраических типах данных, и с ними можно наводить порядок в запутанной логике и куче таблиц в бд, да?
ну или там веб-сервисы какие-нибудь, которые всё время меняются.
когда целая куча разных чужих сервисов, которые меняют как попало совершенно левые люди, удовольствие делать э.. интеграционную программу уменьшается (
как отражать в статических типах данных эти изменения?
например если у нас всюду списки, и всё динамическое, то за счёт паттерн-матчинга можно сделать какую-то "подвижность" в логике программы, и когда в чужой интерфейс внесут небольшое изменение, вдруг может быть оно и не сломается.
(если система не банковская, а простой поиск по разной фигне, и всем наплевать на количество косяков, лишь бы давало хоть какой-то ответ. то есть плевать в какой-то мере на надёжность.)
так вот - можно ли как-то получить удовольствие со статическими типами?
(например в веб-фреймворках можно встретить некий вспомогательный механизм "миграции" для типов данных в таблицах.
и по этим миграциям изредка видно, что куда менялось, и даже можно бывает что-то откатить в какую-нибудь сторону.)
no subject
Date: 2012-02-24 09:20 am (UTC)Требуется вывод типов не "во время компиляции", а "при запуске программы" или "при проверке не изменилась ли схема внешнего источника данных".
Миграция опять же - в обычных языках или нет, или закат солнца вручную, нормально в динамических, а в статических вообще до этого не дошло, потому что на них факториалы считают, или же типы входных данных никогда не меняются.
no subject
Date: 2012-02-24 09:33 am (UTC)no subject
Date: 2012-02-24 09:41 am (UTC)Большая часть ORM и тому подобного на любых языках - тяжкий невыносимый ад.
no subject
Date: 2012-02-24 10:26 am (UTC)а имеет смысл как-нибудь привязать к каждому типу данных номер коммита или текущую дату, а потом делать линк с коротких обычных имён типов данных на самые последние по времени?
и описать миграции (в какую получится сторону в каждом случае).
накладные расходы на преобразование туда-сюда частично возьмёт на себя компилятор этого хаскеля, опять же. надо только ещё извратится со средой разработки.
ну то есть я не шарю, но мля типы должны как-то включать в себя точку во времени, на момент которой они описывают состояние программы.
может правда это нихрена хорошего и не даёт, я хз (
no subject
Date: 2012-02-24 11:02 am (UTC)no subject
Date: 2012-02-24 11:14 am (UTC)no subject
Date: 2012-02-24 11:52 am (UTC)c:Conner, whysmai
no subject
Date: 2012-02-24 08:45 pm (UTC)no subject
Date: 2012-02-27 05:58 am (UTC)тока не надо писать, что это не нужно.
там вон у народа была какая-то zeromq, но хз как это поможет (
no subject
Date: 2012-02-26 06:11 pm (UTC)no subject
Date: 2012-02-26 06:38 pm (UTC)no subject
Date: 2012-02-26 06:45 pm (UTC)no subject
Date: 2012-02-26 07:04 pm (UTC)Реально же достаточно в консоли l(module) сделать, но по-нормальному, конечно, стоит release_handler использовать, а в принципе в документации все описано - http://www.erlang.org/doc/man/code.html#id101126
no subject
Date: 2012-02-26 07:09 pm (UTC)no subject
Date: 2012-02-26 07:20 pm (UTC)no subject
Date: 2012-02-26 06:12 pm (UTC)