swift - Monads 和 AOP 相关?

标签 swift haskell functional-programming

我正在努力尝试理解函数式编程中的 monad 以及它如何应用于我工作的语言(Swift,一种多范式语言)。

据我所知,Monad 是一种主要处理两个编程问题的模式:链接操作,同时隔离状态复杂性(IO、日志、错误、不确定性)。是否正确?

考虑到这一点,似乎可以使用 Monad 来处理函数式解决方案中的事务/原子操作。在我看来(在这一点上)它与面向方面的编程有一些相似之处:将横切关注点的管理及其复杂性与常规业务逻辑分开。

有道理吗?

谢谢!

PS:这个问题不像“什么是 Monad?”那么广泛。

最佳答案

Monad 是计算中几个以前被视为独立的东西的统一。当我说“统一”时,我的意思与物理学家的意思相同:正如牛顿引力统一行星轨道与地球弹道学,麦克斯韦方程统一电场和磁场一样,单子(monad)统一以下内容:

  • 排序(做 A,然后做 B,然后做 C)。
  • 异常处理(执行 A。如果失败则执行 B)。
  • 并行处理(并行处理 A 和 B,然后合并它们的结果)。
  • Non-determinism (做 A。对于每个可能的结果,做 B。对于每个可能的结果,做 C)。
  • State machines .
  • Logic programming , 一个序言。

可能还有一些我忘记了。一旦你理解了单子(monad)的一般理论,你就会意识到它适用于很多事情,就像麦克斯尤尔方程打开了整个电磁波谱,而不是我们认为光和 radio 是两个独立的现象,因此没有意识到有一些非常有趣的东西在他们之间。

这种通用性的一个副作用是您可以编写自己的控制流结构。 “while”和“for”的 Haskell 版本不是内置的,它们是标准库的一部分。如果你想要不同的东西,那么你可以写它。

monad 中的核心概念是“绑定(bind)”(即 (>>=) 运算符)和“返回”(这是一个非常愚蠢的名字,但我们坚持使用它)。这些人必须遵守一些基本的法律。粗略地说,这两个操作是不允许做任何不正当的事情的。因此,“return”不允许有任何副作用,并且不允许在“bind”操作的菊花链中重新排列括号以改变程序的含义。

这确实是抽象的东西,这就是为什么对于在传统命令式语言中长大的程序员来说它看起来很奇怪。只有当你理解了六个不同的单子(monad)时,你才会欣赏这个概念的基本统一性。学习 Haskell 的人首先会遇到 IO monad,因为“Hello World”需要它。在这一点上,它看起来就像是一种奇怪的方式来做所有其他程序所做的事情。这是因为 IO monad 是所有其他编程语言(Prolog 除外)工作方式的模型;对现实世界产生影响的一系列 Action ,包括物理内存中的命名位置。

Haskell monad 的一大优势在于,与其他所有编程语言不同,它不会被困在 IO monad 中。你可以用其他语言定义 monad,但它们仍然以 Haskell 所认为的 IO monad 执行。因为 Haskell 是纯粹的,它可以让您摆脱 IO 的约束并将新的 monad 定义为真正的抽象。

关于swift - Monads 和 AOP 相关?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51043053/

相关文章:

haskell - Haskell 中的所有内容都存储在 thunk 中吗,甚至是简单的值?

haskell - 如何确定一个 Enum 值是否是另一个 Enum 值的后继值?

functional-programming - CSS 不支持在样式中应用样式有什么原因吗?

swift - 核心数据只检索不早于 5 分钟的元素

swift - 无法在 Swift 中导入 MobileDevice 模块

Swift 4 闭包 : failing to access another local property from within the closure

haskell - 使用Haskell的LaTeX自然演绎证明

ios - 即使在 iOS 中导航屏幕时如何始终显示 View Controller ?

recursion - 使用 2 个递归调用进行 F# 尾调用优化?

function - 在 Scala 中,为什么我们在定义方法时需要 "="?