wizzard: (Default)
wizzard ([personal profile] wizzard) wrote2010-12-17 06:16 pm

Зачем нужны динамические языки?

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

за наводку спасибо [livejournal.com profile] thesz

[identity profile] thedeemon.livejournal.com 2010-12-17 04:54 pm (UTC)(link)
>язык, у которого не будет monomorphism restriction и будут выводиться sum types и rank2 types

А можно примеров того, как это бы выглядело/использовалось?

[identity profile] thedeemon.livejournal.com 2010-12-17 05:53 pm (UTC)(link)
А в чем разница между polymorphic variants из камла и выводом sum types?

Реквестирую пример жизненной ФВП, которая требует описания типов и прогибания мозга.

[identity profile] thedeemon.livejournal.com 2010-12-17 06:14 pm (UTC)(link)
А у фабрики внутри что-то обобщенное или просто для разных типов аргумента разные функции на выходе?
В первом случае часто достаточно обычного полиморфизма, даже не rank2.
Во втором напрашиваются sum types с перечислением вариантов.

[identity profile] thedeemon.livejournal.com 2010-12-17 06:38 pm (UTC)(link)
Вроде, можно обойтись без высоких рангов.

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

[identity profile] thedeemon.livejournal.com 2010-12-18 04:57 am (UTC)(link)
У правил типы результатов могут быть разными, тогда в схеме выше будет побольше параметров, но суть не изменится.

[identity profile] thedeemon.livejournal.com 2010-12-17 06:20 pm (UTC)(link)
А как узнать, относится ли некий конструктор к этому же типу, без описания типа? Какова процедура "закрытия"?

[identity profile] thedeemon.livejournal.com 2010-12-17 06:46 pm (UTC)(link)
Это есть:
let is_fruit = function 
  | `Orange | `Apple -> true 
  | `Fish | `Truck _ -> false
	
let make_food = function
  | 1 -> `Orange | 2 -> `Fish | _ -> `Carrot

let x = is_fruit (make_food 3);;
------------------^^^^^^^^^^^-------
Error: This expression has type [> `Carrot | `Fish | `Orange ]
but is here used with type [< `Apple | `Fish | `Orange | `Truck of 'a ]
The second variant type does not allow tag(s) `Carrot

[identity profile] thedeemon.livejournal.com 2010-12-18 04:56 am (UTC)(link)
Не понял последнюю фразу (с чем разница и где реализовать).

[identity profile] jtootf.livejournal.com 2010-12-17 05:25 pm (UTC)(link)
будут выводиться...rank2 types

а это разве возможно?

[identity profile] 3d6.livejournal.com 2010-12-17 09:32 pm (UTC)(link)
Мда, мне все это абсолютно непонятно, но когда у меня возникает проблема обработки данных неизвестного заранее типа - я в С++ использую такую штуку как тип void, а на месте уже смотрю, что там внутри этого воида, и обрабатываю соответственно :)

[identity profile] 0bs3rv3r.livejournal.com 2010-12-18 01:24 am (UTC)(link)
Приз зрительских симпатий отхожит этому камениту.