2

如何在 Ceylon 中实现“monadic for/yield”语法,例如蹦床,因为 Ceylon 不执行尾调用优化。for/yield-syntax 需要引入新的变量名,而使用 Tree-like 语法是不可能的。

在锡兰模拟 Scala 的 for/yield 的最佳方法是什么?

一种解决方案是使用(键入的)地图。这感觉有点像基于 Python 之类的映射创建内部(类型化)脚本语言。

有更好的解决方案吗?

4

2 回答 2

4

您的问题有点令人困惑,因为:

  1. Ceylon 和 Java 一样,根本不做尾递归优化。这不是“正确”或“错误”的问题;这是编译器根本不做的事情。
  2. Ceylon根本没有内置的Monad抽象。Monad可以使用对类型函数的实验性支持来编写自己的类型,但它不是 Ceylon 语言模块或 SDK 的一部分。
  3. Ceylon 推导(有点类似于 Scala 的for/ yield)被定义为跨流,而不是单子。

所以我想你的问题的直接答案是“不”。没有等价物。

为了对您的问题提供更有用的答案,我必须知道您在这里实际想要达到的目标。很难想象在使用 Ceylon 的内置流、序列、集合或元组时如何需要尾调用优化。这些构造都没有设计为通过递归进行迭代,因为递归在 JVM 上效率不高。所以你必须尝试做一些不同的事情,但我不确定那可能是什么。

于 2015-12-22T14:23:52.883 回答
2

注意这里

Scala 的“for comprehensions”是使用 foreach、map、flatMap、filter 或 withFilter 组合多个操作的语法糖。

因此,鉴于 Scala 的 for 理解是语法糖,它们可以通过执行链接页面上显示的翻译在 Ceylon 中轻松模拟。

话虽如此,Ceylon 和 Scala 是具有不同功能的不同语言,这导致了完成类似任务的不同“最佳”方式。因此,仅仅因为您可以在 Ceylon 中模拟某些 Scala 功能并不意味着您应该. 这实际上取决于您要解决的实际问题。

于 2015-12-22T15:28:44.983 回答