Има ли еквивалент на синтаксиса monadic-for/yield на scala в ceylon?

Как може да се постигне ¨monadic for/yield¨ синтаксис в Ceylon, напр. за батут, тъй като Ceylon не извършва оптимизация на опашката. Синтаксисът for/yield изисква въвеждането на нови имена на променливи, което не е възможно при използване на дървоподобен синтаксис.

Кой е най-добрият начин за симулиране на Scala за/доходност в Ceylon?

Едно решение би било да се използва (напечатана) карта. Това изглежда малко като създаване на вътрешен (типизиран) скриптов език, базиран на карти като Python.

Има ли по-добро решение?


person Michael    schedule 22.12.2015    source източник


Отговори (2)


Въпросът ви е малко объркващ, тъй като:

  1. Ceylon, подобно на Java, просто не прави оптимизация на опашната рекурсия. Не е въпросът дали го правиш „правилно“ или „грешно“; това е нещо, което компилаторът просто изобщо не прави.
  2. Просто няма вградена Monad абстракция в Ceylon. Човек може да напише свой собствен тип Monad, като използва експерименталната поддръжка за функции за типове, но това не е част от езиковия модул Ceylon или SDK.
  3. Ceylon разбиранията (които са много приблизително подобни на for/yield на Scala) са дефинирани за обхват над потоци, а не над монади.

Така че предполагам, че директният отговор на въпроса ви е "не". Няма еквивалент.

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

person Gavin King    schedule 22.12.2015
comment
Напълно съм съгласен, че рекурсията не е необходима в Цейлон. Но е възможно. И може да причини изключение на stackoverflow, което е в противоречие с огромните усилия, положени за елиминиране на повечето възможности за грешки по време на изпълнение в ceylon. От друга страна, for/yield на scala е полезен при писането на четлив код. Вземете като пример алгоритъм за логическо обединяване и заместване или по-просто картографиране от едно към друго дърво. По мое мнение би било логично следствие от вашия отговор да изключите напълно пряката и непряката рекурсия и да я третира като грешка, която не е необходима, но рисковано. - person Michael; 23.12.2015
comment
Разбира се, искам да кажа, съгласен съм, че рекурсията на опашката би била добра. Но ми се струва, че най-доброто място за прилагане на това би било в самата виртуална машина. Или може би дори като независим от езика байт код постпроцесор, тъй като проблемът просто не изглежда специфичен за езика. - person Gavin King; 23.12.2015

Отбелязано тук:

„За разбиране“ на Scala са синтактична захар за съставяне на множество операции с foreach, map, flatMap, filter или withFilter.

Така че, като се има предвид, че Scala за разбиране е синтактична захар, те могат лесно да бъдат симулирани в Ceylon чрез извършване на преводите, показани на свързаната страница.

Като се има предвид това, Ceylon и Scala са различни езици с различни функции и това води до различни „най-добри“ начини за изпълнение на подобни задачи. Така че само защото можете да симулирате определени функции на Scala в Ceylon, не означава, че трябва. Това наистина зависи от действителния проблем, който се опитвате да разрешите.

person John Vasileff    schedule 22.12.2015