如何在锡兰实现“monadic for / yield”语法,例如用于蹦床,因为锡兰不执行尾部呼叫优化。 for / yield-syntax需要引入新的变量名,而使用类似树的语法是不可能的。
在锡兰模拟Scala for / yield的最佳方法是什么?
一种解决方案是使用(类型)地图。这有点像基于像Python这样的地图创建内部(类型)脚本语言。
有更好的解决方案吗?
答案 0 :(得分:4)
你的问题有点令人困惑,因为:
Monad
抽象。可以使用类型函数的实验支持来编写自己的Monad
类型,但它不是Ceylon语言模块或SDK的一部分。for
/ yield
大致相似)被定义为在流上而不是在monad上。所以我猜你问题的直接答案是“不”。没有等价物。
为了给你的问题提供更有帮助的答案,我必须知道你在这里想要实现的目标。在使用Ceylon的内置流,序列,集合或元组时,很难想象尾部调用优化的需求是如何产生的。这些构造都没有设计为通过递归进行迭代,因为递归在JVM上效率不高。所以你必须尝试做一些不同的事情,但我不确定那可能是什么。
答案 1 :(得分:2)
注意here:
Scala的“for comprehensions”是使用foreach,map,flatMap,filter或withFilter组合多个操作的语法糖。
因此,鉴于Scala的理解是语法糖,可以通过执行链接页面上显示的翻译在Ceylon中轻松模拟它们。
话虽这么说,锡兰和斯卡拉是不同的语言,具有不同的特征,这导致不同的"最佳"完成类似任务的方法。所以,仅仅因为可以模拟Ceylon中的某些Scala功能并不意味着你应该。这实际上取决于你想要解决的实际问题。