【问题标题】:Is there an equivalent to scala's monadic-for/yield syntax in ceylon?锡兰中是否有等效于 scala 的 monadic-for/yield 语法?
【发布时间】:2015-12-22 23:33:58
【问题描述】:

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

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

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

有没有更好的解决方案?

【问题讨论】:

    标签: ceylon


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我完全同意锡兰不需要递归。但这是可能的。并且它可能会导致 stackoverflow 异常,这与消除锡兰中大多数运行时错误的可能性所付出的巨大努力相矛盾。另一方面,scala 的 for/yield 有助于编写清晰的代码。以逻辑统一和替换算法或从一棵树到另一棵树的更简单映射为例。在我看来,完全排除直接和间接递归并将其视为不必要但有风险的错误将是您回答的一个合乎逻辑的结果。
    • 当然,我的意思是,我同意尾递归会很好。但在我看来,实现它的最佳位置是在 VM 本身中。或者甚至可以作为与语言无关的字节码后处理器,因为问题似乎与语言无关。
    【解决方案2】:

    注明here

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多