Alexander Kuklev ([info]akuklev) wrote,
@ 2008-07-13 22:18:00
Previous Entry  Add to memories!  Tell a Friend!  Next Entry
* is obsolete. Да здравствует новый король.
Четыре года тому назад я писал вот прямо в этот ЖЖ, что наконец понял, как должна быть правильно устроена система типов и перегрузка операторов, зачем как именно оно должно быть отдельено от ООП и как должно выглядеть последнее. Показал с примерами кода. (Был, кстати, отчасти заклёван [info]firtree) Начиная с того, что

a + b + c — это вовсе не a.add(b).add(c)
a + b + c = (AdditiveSemigroup.[+] a, b, c)
А вот функция AdditiveSemigroup.[+] должна извлекать наиближайшего общего предка a, b и c, являющгося имплементирующим интерфейс AdditiveSemigroup, в котором должна иметься статическая функция add(a, b), выполняющая аксиомы полугруппы. И вот этот AdditiveSemigroup.[+] должен вызывать эту функцию для сложения. Причём, оптимизируя вызовы для параллелизации, т.е. превращая список в бинарное дерева и редуцируя его. Не (((a + b) + c) + d), а ((a + b) + (c + d)).
А ежели аддитивная семигруппа ещё явлется и моноидом, то AdditiveSemigroup.[+]() должна выплёвывать .unit.

Потом я писал всякое про миксины.. Так вот. Сегодня [info]sorhed наконец заставил меня прочитать про Скалу. И я понял, что в мире наконец-то появился язык программирования, на котором мне не пративно писать. Это язык программирования, авторы которого врубаются и в то, как надо делать систему типов, и в то, как делать императивное программирование (в первую очередь, мутабельные переменные), не выходя за рамки абсолютно чистой лямбда-семантики. Да, авторы старательно прячут эти вещи от программиста, справедливо считая его идиотом слабо знакомым с ФП, но внутри у них всё на месте.

Цитирую пример со Scala.org:
    abstract class SemiGroup[A] {
      def add(x: A, y: A): A
    }
    abstract class Monoid[A] extends SemiGroup[A] {
      def unit: A
    }
    object ImplicitTest extends Application {
      implicit object StringMonoid extends Monoid[String] {
        def add(x: String, y: String): String = x concat y
        def unit: String = ""
      }
      implicit object IntMonoid extends Monoid[int] {
        def add(x: Int, y: Int): Int = x + y
        def unit: Int = 0
      }
      def sum[A](xs: List[A])(implicit m: Monoid[A]): A =
        if (xs.isEmpty) m.unit
        else m.add(xs.head, sum(xs.tail))

      println(sum(List(1, 2, 3)))
      println(sum(List("a", "b", "c")))
    }
@ http://www.scala-lang.org/intro/implicit.html

В скале вообще есть всё, для того, чтобы можно было начинать работать. Кое-какой template matching (не Хаскелл, конечно, но очень хорошо), Erlang-style messaging system, базовая функциональщина и прекрасный интерфейс ко всему богатству существующих библиотек для говноджавы. Есть даже case classes (известные также как «конструкторы» в среде функциональщиков и «енумы с параметрами» в среде императивщиков), те самые, позволяющие писать эффективные стейт-машины и темплейты-генераторы, а так же выпендриваться знанием слова катаморфизм.

Вы всё ещё кипятите? Тогда мы идём к вам!



(Post a new comment)


[info]xsbos
2008-07-13 10:50 pm UTC (link)
Да, язык чудесный просто. Какую IDE предложите?

(Reply to this)(Thread)


[info]akuklev
2008-07-13 10:53 pm UTC (link)
Intellij Idea — лучшая IDE всех времен и народов для Java и сопустствующих языков.
С восьмой версии там поддерживается Scala. Сейчас её в релизе ещё нет, но можно взять EAP с сайта.

(Reply to this)(Parent)(Thread)


[info]xsbos
2008-07-13 10:59 pm UTC (link)
Да, idea всем хороша кроме того, что отчаянно тормозит на не очень крутом железе

(Reply to this)(Parent)(Thread)


[info]akuklev
2008-07-13 11:04 pm UTC (link)
У меня на ноуте лишь легонько притормаживает, а у меня не ультра-супер.
Но даже на прошлом ноуте, где оно ещё тормозило, оно того стоило. Хрен с ним, что тормозит, зато всё на месте и ничего не мешает.

(Я никак не аффилирован с производителями Идеи, просто фанат ея качества.)

(Reply to this)(Parent)


[info]sorhed
2008-07-13 11:12 pm UTC (link)
Эклипс тормозит не меньше.

Сколь угодно крутое железо может быть приобретено за недельную стоимость работы хорошего девелопера. :)

(Reply to this)(Parent)(Thread)


[info]xsbos
2008-07-13 11:26 pm UTC (link)
У меня меньше. Ну, ладно, лучше-то ничего нет

(Reply to this)(Parent)


[info]migmit.vox.com
2008-07-14 07:16 am UTC (link)
На слове "ООП" мне становится скучно.
Хотя, иногда это можно перебороть.

(Reply to this)


[info]dr_math
2008-07-14 10:50 am UTC (link)
а в чем разница между a + b + c — это вовсе не a.add(b).add(c) и
a + b + c = (AdditiveSemigroup.[+] a, b, c)? в том что сложение определенно вне a,b,c?

(Reply to this)(Thread)


[info]akuklev
2008-07-14 03:16 pm UTC (link)
Именно в том, что сложение определено вне a, b и c. Это не member объектов (скажем чисел), а операция заданная для их типа.

(Reply to this)(Parent)(Thread)


[info]dr_math
2008-07-15 02:36 am UTC (link)
а можно поподробнее чем именно ето лучше? ну и чего-нибудь на related topics.

(Reply to this)(Parent)(Thread)


[info]akuklev
2008-07-15 03:00 am UTC (link)
Прагматическая польза с этого только в возможности автоматической паралеллизации сложений, т.е. этой пользы не очень много.
Польза в большей степени структурная. Система типов языка должна уважать математику. Когда мы складываем математические объекты — это не «они знают, как к ним прибавлять число». Это структура, к которой они принадлежат, имеет определённую на себе бинарную операцию.

(Reply to this)(Parent)(Thread)


[info]dr_math
2008-07-15 03:12 am UTC (link)
о чем думали люди, придумавшие языки, которые не так работают? они ж не дураки...

(Reply to this)(Parent)(Thread)


[info]akuklev
2008-07-15 03:24 am UTC (link)
Они не дураки, но и не боги. Они думали о простоте имплементации.

На заре ООП, когда о перегрузке операторов ещё никто не слышал, Алана Кея в первом варианте языка смоллток закрепил за a + b значение a.add(b). Причём, в Смоллтоке не выполняется порядка операций. 1 + 2 * 3 = 9. В рамках Смоллтока иначе вообще никак не сделаешь и пионер Кей пошел на такой вот отвратительный компромисс. Отвратителен он тем, что контринтуитивен, и таким образом вызвал сотни ошибок. Именно из-за таких вот мелочей Смоллток, кстати, и не удался.

Потом перегрузку операторов стали делать в других языках, и кстати, по-разному. Однако товарищ Страуструп, автор С++, сделал по-смоллтоковому. По той же причине, что и Аллан Кей: в рамках языка до появления темплейтов иначе было вообще никак. Потом темплейты появились, и если мне не изменяет память, перегрузка операторов в STL сделана правильно и кошерно — она учитывает типы обоих операндов. Однако для этого требуется магия третьего уровня и этим никто не пользовался.

Авторы 90% последующих языков, похоже, копировали принятый в С++ способ вообще не задумываясь, что можно иначе. В некоторых ФЯП существуют т.н. классы типов. Перегрузка операторов делается через них, способом сходным с тем, что используется в Scala.

(Reply to this)(Parent)(Thread)


[info]dr_math
2008-07-15 03:29 am UTC (link)
вообщем никаких преимуществ делать не так нет, я правильно понял?

мне аж стало интересно как это у нас имплементировано...

(Reply to this)(Parent)(Thread)


[info]akuklev
2008-07-15 03:31 am UTC (link)
Прагматических преимуществ я сходу не вижу.
Ну это то же преимущество, что есть у Хаскелла перед ПХП. И то, и другое работает, только на одном всё правильно, а на другом всё через жопу.

«у вас» — это где?

(Reply to this)(Parent)(Thread)


[info]dr_math
2008-07-15 03:34 am UTC (link)
про хаскелл и пхп мне ничего не говорит. я только названия слышал;)

у нас - это в proprietary языке одного большого банка...

(Reply to this)(Parent)


[info]ulysses4ever
2008-07-15 05:46 pm UTC (link)
Вы не могли бы посоветовать какую-нибудь внятную литературу по Type Theory? Хочется тоже словом “катаморфизм” выпендриваться со всеми основаниями...

(Reply to this)(Thread)


[info]akuklev
2008-07-15 05:51 pm UTC (link)
Честно говоря, не знаю, что Вам посоветовать. Я как-то очень кусочно собирал информацию, потом читал пару книжек, но вот чтобы что-то конкретное порекомендовать...
Попробуйте, пожалуй, спросить у товарищей типа [info]potan.

(Reply to this)(Parent)(Thread)


[info]ulysses4ever
2008-07-15 06:01 pm UTC (link)
Спасибо.

(Reply to this)(Parent)


[info]alexott
2008-07-16 10:05 am UTC (link)
а участники ICFPC 2008 (одна из русских комманд) очень сильно ругали скалу по результатам использования

(Reply to this)

Черная магия. Приворот. Порча. Обучение магии.
(Anonymous)
2008-09-18 07:50 pm UTC (link)
На сайте http://blackmagic1.com/ можно записаться на уроки Черной Магии по доступным ценам. Здесь Вы найдёте много старинных и редких книг, по Черной Магии. Также можете заказать ритуалы Черной Магии амулеты и магические предметы.

(Reply to this)


Create an Account
Forgot your login?
Login w/ OpenID
English • Español • Deutsch • Русский…