2015-12-22 2 views
2

Как можно добиться синтаксиса ¨monadic for/yield¨ на Цейлоне, например. для батуминга, поскольку Цейлон не выполняет оптимизацию хвостовых вызовов. Синтаксис for/yield требует введения новых имен переменных, что невозможно с помощью синтаксиса типа Tree.Есть ли эквивалент синтаксиса monadic-for/yield scala в ceylon?

Каков наилучший способ моделирования работы Scala в/Ceylon?

Одним из решений является использование (типизированной) карты. Это немного похоже на создание внутреннего (типизированного) языка сценариев на основе таких карт, как Python.

Есть ли лучшее решение?

ответ

4

Ваш вопрос немного сбивает с толку, так как:

  1. Цейлон, как Java, просто не делает оптимизацию хвостовой рекурсии. Дело не в том, чтобы делать это «правильно» или «неправильно»; это то, что компилятор просто не делает вообще.
  2. Просто нет встроенной абстракции Monad на Цейлоне. Можно написать собственный тип Monad, используя экспериментальную поддержку функций типа, но он не является частью языкового модуля Ceylon или SDK.
  3. Ceylon comprehensions (которые являются примерно похожими на Scala's for/yield), определены как диапазоны над потоками, а не над монадами.

Итак, я думаю, что прямой ответ на ваш вопрос «нет». Нет эквивалента.

Чтобы дать более полезный ответ на ваш вопрос, я должен был бы знать, чего вы на самом деле пытаетесь достичь здесь. Трудно представить, как возникла необходимость оптимизации оптимизации хвоста при работе с встроенными потоками, последовательностями, коллекциями или кортежами Ceylon. Ни одна из этих конструкций не была спроектирована так, чтобы быть повторенной путем рекурсии, поскольку рекурсия просто неэффективна для JVM. Поэтому вы должны пытаться сделать что-то другое, но я не уверен, что это может быть.

+1

Я полностью согласен с тем, что рекурсия не нужна в цейлоне. Но это возможно. И это может привести к исключению stackoverflow, что противоречит трезвым усилиям, предпринятым для устранения большинства возможностей ошибок времени выполнения в цейлоне. С другой стороны, scala's for/yield полезно при написании разборчивого кода. Возьмем в качестве примера логический алгоритм унификации и подстановки или упрощенное сопоставление от одного к другому дереву.По моему мнению, было бы логичным следствием вашего ответа, чтобы полностью исключить прямую и непрямую рекурсию и рассматривать ее как ошибку, которая не является необходимой, а рискованной. – Michael

+0

Конечно, я имею в виду, я согласен, что рекурсия хвоста будет приятной. Но мне кажется, что лучшее место для реализации будет в самой ВМ. Или, возможно, даже как независимый от языка пост-процессорный байт-код, поскольку проблема просто не кажется специфичной для языка. –

2

Отметил here:

в Scala «для постижений» является синтаксическим сахаром для состава нескольких операций с Еогеасп, картой, flatMap, фильтром или withFilter.

Итак, учитывая, что Scala для понимания является синтаксическим сахаром, их можно легко смоделировать на Цейлоне, выполнив переводы, показанные на связанной странице.

Это говорит о том, что Цейлон и Скала - это разные языки с различными функциями, что приводит к различным «лучшим» способам выполнения подобных задач. Итак, только потому, что вы можете имитировать некоторые функции Scala на Цейлоне, это не значит, что вы должны. Это действительно зависит от конкретной проблемы, которую вы пытаетесь решить.