在锡兰,是否有与scala的monadic-for / yield语法相同的东西?

时间:2015-12-22 13:11:06

标签: ceylon

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

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

一种解决方案是使用(类型)地图。这有点像基于像Python这样的地图创建内部(类型)脚本语言。

有更好的解决方案吗?

2 个答案:

答案 0 :(得分:4)

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

  1. Ceylon和Java一样,根本不做尾递归优化。这不是“正确”或“错误”的问题;这是编译器根本不做的事情。
  2. 锡兰没有内置的Monad抽象。可以使用类型函数的实验支持来编写自己的Monad类型,但它不是Ceylon语言模块或SDK的一部分。
  3. 锡兰comprehensions(与Scala的for / yield大致相似)被定义为在流上而不是在monad上。
  4. 所以我猜你问题的直接答案是“不”。没有等价物。

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

答案 1 :(得分:2)

注意here

  

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

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

话虽这么说,锡兰和斯卡拉是不同的语言,具有不同的特征,这导致不同的"最佳"完成类似任务的方法。所以,仅仅因为可以模拟Ceylon中的某些Scala功能并不意味着你应该。这实际上取决于你想要解决的实际问题。