Зачем нужны динамические языки?
http://gnuu.org/2010/12/13/too-lazy-to-type/
>> Are we really writing "dynamic" programs, or are we just trying to avoid writing down all those type signatures?
Да, естественно. Сделает кто-то язык, у которого не будет monomorphism restriction и будут выводиться sum types и rank2 types (а остальное будет писать ворнинги и работать в динамике) - его ж на руках носить будут.
Профит от динамики в том, что не нужно прогибать мозг (в начале разработки) под расхождения системы типов и проблемной области (в счет последующих багфиксов, но начальству-то уже показано, что работает, а к багам все привыкли)
Причем, уже ж вполне наработаны и обкатаны технологии gradual typing – на тех же Javascript-движках, которые продолжают делать вид, что язык динамический %)
А, и конечно же есть сценарии вроде динамической перезагрузки кода, но я не вижу ничего концептуально невозможного, тут наоборот тайпчекер бы помогал проверить совместимость, например.
Тем временем, пока такую штуку еще не сделали, буду писать на Питоне дальше :D
no subject
А можно примеров того, как это бы выглядело/использовалось?
no subject
вывод sum types практически избавляет нас от необходимости писать data declarations и дает (имхо) даже более мощный инструмент, чем polymorphic variants из камла.
вывод rank2 вкупе с отсутствием MR дает возможность писать намного меньше type definitions для функций высшего порядка и то самое "не нужно прогибать мозг (в начале разработки)"
Также, не исключено что я где-то гоню (например, перепутал термины с похожими именами)
no subject
Реквестирую пример жизненной ФВП, которая требует описания типов и прогибания мозга.
no subject
ну вот в текущем проекте есть factory парсеров, парсящих arbitrary data structures (в смысле, не только списки строк\токенов), это вполне себе ФВП rank2, может и больше. как ее протипизировать - я откровенно не представляю.
no subject
В первом случае часто достаточно обычного полиморфизма, даже не rank2.
Во втором напрашиваются sum types с перечислением вариантов.
no subject
no subject
type ('token, 'res) rule = R1 of 'token * 'res option | R2 of 'token * 'res option (*kinds of rules*)
type ('token, 'res) grammar = ('token, 'res) rule list
type ('token, 'res) parser = 'token list -> 'res option
type ('token, 'res) factory = ('token, 'res) grammar -> ('token, 'res) parser
no subject
(думал 15 минут, в итоге всё стёр)
Без высоких рангов обойтись, конечно, можно. Только типизация какая-то динамическая получается.
Т.е. вот сейчас есть (извращенная, без BinOp можно тривиально обойтись, но хочется проиллюстрировать) грамматика для калькулятора.
grammar Calc{
Number = Number:n Digit:d -> n*10 + int(d)
| Digit:d ' '* -> int(d)
BinOp :arg1 :opChar :arg2 :op = arg1:x opChar arg2:y -> op(x,y)
UnaryExpr = Number | '(' AddExpr ')'
MulExpr = BinOp(MulExpr, '*', UnaryExpr, lambda a,b: a*b):x -> x
| PrimExpr:x -> x
AddExpr = BinOp(AddExpr, '+', MulExpr, lambda a,b: a+b):x -> x
| MulExpr:x -> x
Start = AddExpr
}
У грамматики 'res, очевидно, int. 'token - char.
А у правил?
P.S. надеюсь, нигде не опечатался :D
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
а это разве возможно?
no subject
no subject
no subject