【问题标题】:Does Kotlin support monadic comprehension?Kotlin 是否支持一元理解?
【发布时间】:2019-08-29 09:54:47
【问题描述】:

像 C# 中的 LINQ,在 Scala 中的理解,在 Kotlin 中有什么类似的吗?如果不支持,是否有计划?

【问题讨论】:

  • 我想,这里有一些误解。没有在任何地方都不使用 monad 的政策。语言中内置了一些类似 monad 的构造,例如对可空类型的安全调用。我们目前不支持推导式,但这个功能已经在桌面上。
  • 正如@AndreyBreslav 所指出的,Kotlin 确实在有意义的地方使用了单子结构。我在回答中所说的是,在每个单一语言概念中使用单子是没有目标的

标签: kotlin


【解决方案1】:

在 Kotlin 1.1 的预览版中,有通用的 async/await 语法,可用于不同类型的一元推导:

许多语言(从 2012 年的 C# 开始)支持异步 通过专用语言结构(例如 async/await)进行编程 关键字。在 Kotlin 中,我们推广了这个概念,以便库可以 定义他们自己的此类构造版本,并且 async 不是 关键字,但只是一个函数。

这种设计允许集成不同的异步 API: 期货/承诺,回调传递等。它也足够通用 表达惰性生成器(yield)并涵盖其他一些用例。

source

【讨论】:

    【解决方案2】:

    没有特殊的关键字(do/for),因此没有像其他语言那样直接翻译成嵌套的 flatMap(去糖)。

    但是单子理解可以通过协程来实现。

    来自箭头文档:https://arrow-kt.io/docs/patterns/monad_comprehensions/#comprehensions-over-coroutines

    对协程的理解

    这个特性有多个名字:async/await、coroutines、do 符号,用于理解……每个版本都包含某些独特的 点,但都源于相同的原则。在 Kotlin 中,协程 (在语言的 1.1 版中引入)使编译器能够 将看似同步的代码重写为异步序列。 Arrow 使用编译器的这一功能为您带来 Monad 类型类的所有实例的类协程表示法。

    这意味着推导可用于 Option、Try、List、 Reader、Observable、Flux 或 IO 都一样。

    对于协程,另见“Deep into Coroutines on JVM @ KotlinConf 2017”:https://www.slideshare.net/elizarov/deep-dive-into-coroutines-on-jvm-kotlinconf-2017?next_slideshow=1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-24
      • 2014-06-25
      • 2016-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-04
      • 2021-11-15
      相关资源
      最近更新 更多