Хаскельное
Sep. 14th, 2013 08:17 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
http://vit-r.livejournal.com/679524.html?thread=3691364#t3691364
решили на прошлой работе трое таки попробовать Хаскель, для неспешной задачи. генерация DDL, DML c скриптами SQL. Бились, бились, - но сделали, и был восторг! Потом, затянула обычная работа, через месяцок нужно было добавить кое-чего... и никто из троих не смог понять как оно работает, и как же добавить.
Звучит похоже на правду. Хотя у меня и F# и Clojure в подобных задачах живут и развиваются без проблем.
решили на прошлой работе трое таки попробовать Хаскель, для неспешной задачи. генерация DDL, DML c скриптами SQL. Бились, бились, - но сделали, и был восторг! Потом, затянула обычная работа, через месяцок нужно было добавить кое-чего... и никто из троих не смог понять как оно работает, и как же добавить.
Звучит похоже на правду. Хотя у меня и F# и Clojure в подобных задачах живут и развиваются без проблем.
no subject
Date: 2013-09-16 06:04 pm (UTC)Т.е. нет. В отличие от компилятора, статический анализатор
1. не ограничен во времени => может проводить более глубокую проверку кода.
2. имеет право на ошибку - предупреждения статического анализатора любой степени серьёзности могут быть ложными.
Поэтому статический анализатор может, в отличие от компилятора, ругнуться на условный код
let 2d_distance_from_origin {x : float; y : float; z : float} in
let x = p.x in
let y = p.z in
x^2 + x^2;;
Ну и тому подобные, формально верные конструкции, которые часто могут быть следствием опечатки.
И, хотя, Хаскел значительно лучше С, от подобных вещей он не защищает.
no subject
Date: 2013-09-16 07:24 pm (UTC)Хаскелл оказался защищён от таких ошибок гораздо хуже, чем с++ )))
no subject
Date: 2013-09-16 09:20 pm (UTC)data Y
data Z
data Coord c a = C a -- c - phantom type, does not add runtime overhead.
instance Num a => Num (Coord c a) where ... -- you cannot add Coord X Float and Coord Y Float
type Vec a = (Coord X a, Coord Y a, Coord Z a)
field :: XYZ b => Vec a -> b -> Coord b a
field = ...
f p = let x = field p X; y = field p Z in x*x + castFromY (y*y) -- compiler error
no subject
Date: 2013-09-16 09:43 pm (UTC)Подобную же штуку можно криво-косо сделать на С++, только овчинка выделки не стоит. Из-за раздутия кода вы сделаете ещё пару ошибок и т.д. Ухудшите ясность.
Я не спорю, что проверки в Хаскелле значительно круче, чем проверки в С++. Но в любом языке остаётся круг ошибок, которые не являются достойными занесения в компилятор, но вполне известны и часто повторяемы.
no subject
Date: 2013-09-17 04:24 am (UTC)В Хаскеле я могу ограничить круг пропускаемых ошибок чрезвычайно малым числом. Библиотекой, не компилятором. Ну, и что, что в C++ так нельзя?
Насчет "как норму считать" - отдельной функцией, верифицированной. Как это делается в обычных библиотеках.
no subject
Date: 2013-09-17 01:21 pm (UTC)Со стат. анализатором наверняка можно будет ещё больше ограничить. Но пока, видимо, кол-во ошибок слишком мало по сравнению с конкурентными языками. Поэтому создание стат. анализатора для Хаскеля нерентабельно.
no subject
Date: 2013-09-17 01:47 pm (UTC)В зависимых типах вы можете ограничить себя так, как хотите и компилятор совершенно эквивалентен статическому анализатору.