Пока самые лучшие и знаменитые наши умы заняты очень серьезным мероприятием, хочу поделиться со всеми остальными о наболевшем.
Есть у меня одна уже работающая задумка, но мне нужен для Scala хороший и удобный синтаксический сахар для монад (эх, еще бы для стрелок…). Мечтаю о чем-то подобном computation expressions из F# - это такой аналог нотации do для языка, в котором нет классов типов. Как понимаю, нужен плагин к компилятору в случае Scala.
Ни встроенный for-comprehension, ни плагин продолжений не впечатляют нисколько. Отчасти они дублируют друг друга, но ни одно из них не решает свою задачу хорошо в моем понимании, давно извращенным другими языками. В общем, тот случай, где количество не переходит в качество, и даже не помышляет о том.
Очень хотел использовать Scala, но сейчас пребываю в полной печали. Для моей задачи технически идеально подходит Haskell, но я хочу продвинуть библиотеку в широкие массы, а потому Haskell пока хорош только как полигон для выработки, обкатки и кристаллизации моих безумных идей, и здесь он свою миссию уже выполнил на все 350% с блеском и шиком. Но сейчас хочется получить уже широкую аудиторию из исключительно меркантильных соображений, а потому интересует Scala.
А чем for конкретно не устраивает? Он же от do-нотации отличается только ключевым словом.
ОтветитьУдалитьЕсть важные отличия. Хаскелевский do поддерживает if и case. Плюс в случае императивного языка, каким является Scala, обязательно должна была бы быть поддержка для try и while, которая, к слову сказать, есть в плагине продолжений, но у того свои недостатки. Итого фактически получается, что сложную логику записать нельзя, тогда зачем этот for-comprehension нужен?
ОтветитьУдалитьЕсли что, то это риторический вопрос - для примитивных вещей я его часто использую, но прекрасно осознаю, насколько он примитивен и ограничен.
Так, что сопоставлять как равное с нотацией do из Haskell или с вычислительными выражениями из F# я бы точно не стал, поскольку я со всем этим много работал.
> Хаскелевский do поддерживает if и case.
УдалитьВ каком смысле "поддерживает"? В do-нотации (и скальном for) же нету никаких ограничений, то есть оно искаробки поддерживает все - и if, и while и try. Или что имеется в виду?
Ну, и на закуску. Я не нашел красивого способа включить вычисление типа m () в for-comprehension. Так, чтобы без липовых переменных и подчеркиваний. В общем, говорить как о равных нотациях точно нельзя. Даже в случае F# приходится писать дурацкое do!.
ОтветитьУдалитьЭм... в do-нотации Хаскеля нет никакой специфической поддержки if и case. Точно так же можно утверждать, что хаскелевский do поддерживает умножение.
ОтветитьУдалить2migmit: Ну, ладно, тут можно согласиться. Это я с F# попутал (и еще со стрелками Haskell). В F# match и if явно поддерживаются на уровне comp exprs. Точно также, match и if явно поддерживаются в плагине продолжений в Scala. Пойнт еще в том, что в Haskell эта интеграция идет естественно, а в Scala ее надо явно поддерживать. В общем, без этой штуки жизни не представляю на Scala.
ОтветитьУдалитьhttps://github.com/aztek/master-thesis
ОтветитьУдалитьhttps://github.com/aztek/scala-workflow
2triampurum: Спасибо! Изучаю.
УдалитьЗдорово! Примерно такое я и надеялся найти. Буду пробовать. А автору могу пожелать хорошего продвижения на инглише. Наверное, надо на этом языке ему написать хорошую обзорную статью.
УдалитьУвы, не все так гладко со scala-workflow. Идея замечательная, но пока нет поддержки while, try, match и if, еще (мечтательно) lazy. Это решаемо, даже lazy. Но мне непонятно, как быть с тем, что untyped macros, вероятно, решили выпилить из Scala. Вот, последнее - уже очень серьезная проблема. А без них не видать полноценного синтаксического сахара для монад, похоже.
ОтветитьУдалитьВсерьез начал рассматривать возвращение к F# поле перерыва в несколько лет, но ужасно не хочется быть привязанным к продукции Микрософта.
Стоит обговорить эти моменты с https://twitter.com/#!/xeno_by , он в курсе этой и других разработок монадических DSL'ей (были и другие, с ходу не вспомню линки) и, к тому же, в курсе будущей судьбы макросов.
Удалитьxeno_by, если что, общается по-русски
ОтветитьУдалить