【发布时间】:2017-05-12 06:33:17
【问题描述】:
Wikipedia article on monads 说:
纯函数式程序可以使用 monad 来构建包含有序操作的过程,就像结构化编程中的那些。
不是在这里寻找(另一个)monad 教程。请举一个单子的例子,当只运行一个函数然后另一个是不够的时,可以进行顺序操作。它是否与那些按照功能语言规范惰性的函数调用有关?为什么非互换函数的顺序运行需要任何“包装器”?
【问题讨论】:
-
您的问题措辞不是很清楚。你能修改你的帖子,让你的问题更容易理解吗?
-
实际上对更一般的 F 代数进行排序是可能的。想想
foldl。 Monad 之所以重要,正是因为它们可以定义表现更好的 T 代数(如 Kleisli 代数)。 -
所以你的直觉(不管那是什么)也许是正确的,单独的操作顺序并不能表征单子。
-
在“透明”单子中,您可以访问底层定义(例如状态、读取器、写入器、延续、列表,也许......),您可以在不提及单子的情况下做任何事情,并且只使用普通函数。然而,monad 抽象是有用的,因为它是所有这些情况的共同点。它更多的是关于便利而不是必要性。但是,在像 IO 或 ST 这样的不透明 monad 中,该库不允许排序,而是通过 monad 接口进行。
-
那么,如果这个问题的真正动机是“单子真的只是为了测序而需要吗?”那么答案肯定是否定的。一个更好的问题是“如果 IO 不是 monad 会出现什么样的麻烦?”