【问题标题】:Monad vs sequential function callsMonad vs 顺序函数调用
【发布时间】:2017-05-12 06:33:17
【问题描述】:

Wikipedia article on monads 说:

纯函数式程序可以使用 monad 来构建包含有序操作的过程,就像结构化编程中的那些。

不是在这里寻找(另一个)monad 教程。请举一个单子的例子,当只运行一个函数然后另一个是不够的时,可以进行顺序操作。它是否与那些按照功能语言规范惰性的函数调用有关?为什么非互换函数的顺序运行需要任何“包装器”?

【问题讨论】:

  • 您的问题措辞不是很清楚。你能修改你的帖子,让你的问题更容易理解吗?
  • 实际上对更一般的 F 代数进行排序是可能的。想想foldl。 Monad 之所以重要,正是因为它们可以定义表现更好的 T 代数(如 Kleisli 代数)。
  • 所以你的直觉(不管那是什么)也许是正确的,单独的操作顺序并不能表征单子。
  • 在“透明”单子中,您可以访问底层定义(例如状态、读取器、写入器、延续、列表,也许......),您可以在不提及单子的情况下做任何事情,并且只使用普通函数。然而,monad 抽象是有用的,因为它是所有这些情况的共同点。它更多的是关于便利而不是必要性。但是,在像 IO 或 ST 这样的不透明 monad 中,该库不允许排序,而是通过 monad 接口进行。
  • 那么,如果这个问题的真正动机是“单子真的只是为了测序而需要吗?”那么答案肯定是否定的。一个更好的问题是“如果 IO 不是 monad 会出现什么样的麻烦?”

标签: scala haskell monads


【解决方案1】:

Haskell Monad Tutorial 清楚地展示了以单子方式对函数调用进行排序的示例:

type Sheep = ...

father :: Sheep -> Maybe Sheep
father = ...

mother :: Sheep -> Maybe Sheep
mother = ...

-- comb is a combinator for sequencing operations that return Maybe
comb :: Maybe a -> (a -> Maybe b) -> Maybe b
comb Nothing  _ = Nothing
comb (Just x) f = f x

-- now we can use `comb` to build complicated sequences
mothersPaternalGrandfather :: Sheep -> Maybe Sheep
mothersPaternalGrandfather s = (Just s) `comb` mother `comb` father `comb` father

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-14
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 2018-05-08
    • 2014-06-20
    相关资源
    最近更新 更多