monad是否只是组合函数的方式,否则不会构成?

时间:2012-06-02 11:42:02

标签: haskell monads

绑定功能看起来非常类似于合成功能。它有助于编写返回monad的函数。

对于单子而言,还有什么比这个想法更有启发性吗?

2 个答案:

答案 0 :(得分:15)

  

对于单子而言,还有什么比这个想法更有启发性吗?

是的,非常如此!

Monadic绑定是一种组合函数的方法,其中其他正在函数应用程序之上和之上发生输入。 别的东西取决于所考虑的monad。

  • Maybe monad是函数组合,可能链中的一个函数可能会失败,在这种情况下,失败会自动传播到链的末尾。表达式return x >>= f >>= gf应用于值x。如果结果为Nothing(即失败),则整个表达式返回Nothing,而不进行其他工作。否则,g将应用于f x并返回其结果。

  • Either e monad,其中e是某种类型,是函数组合,可能会因类型为e的错误而失败。这在概念上类似于Maybe monad,但我们可以获得有关故障发生方式和位置的更多信息。

  • List monad是函数组合,可以返回多个值。如果fg是返回输出列表的函数,则return x >>= f >>= gf应用于x,然后将g应用于每个输出f,将这些应用程序的所有输出收集到一个大列表中。

其他monad代表各种其他环境中的函数组合。非常简短:

  • Writer w monad是函数组合,其值为w,在侧面累积。例如,通常w = [String](字符串列表)对记录有用。

  • Reader r monad是函数组合,其中每个函数也允许依赖于类型r的值。这在为特定于域的语言构建评估程序时很有用,当r可能是从变量名到映射中的值的映射时 - 例如,这允许简单地实现词法闭包。

  • State s monad有点像读者和作家的组合。它是函数组合,允许每个函数依赖并修改s类型的值。

答案 1 :(得分:6)

构成观点实际上本身就很有启发性。

Monads可以被视为a -> Mb形式的函数之间的一些“时髦组合”。您可以通过monad操作将f : a -> M bg: b -> M c组合成a -> M c内容(只需将f的返回值绑定到g)。

这会将a -> M b形式的箭头转换为类别的箭头,称为M Kleisli类别

如果M不是monad而只是一个仿函数,那么您只能将fmap gf组合成(fmap g) . f :: a -> M (M c)。 Monads有join :: M (M a) -> M a,我允许你只使用monad操作定义为(简单而有用)练习(对于数学家来说,join通常是monad定义的一部分)。然后join . (fmap g) . f提供Kleisli类别的组合。

因此可以看出所有monadic组合的恐惧都发生在join内,join代表副作用的组合:对于IO它排序效果,List它连接列表,Maybe它“在结果为Nothing时停止计算”,WriterState排序写入,{{1}}如果你知道类C语言,它可以看作是一个“可重载的分号”。以这种方式思考monads是非常有益的。

当然,Dan Piponi比我更好地解释了这一点,这里有一些他可能会发现启发的帖子:http://blog.sigfpe.com/2006/06/monads-kleisli-arrows-comonads-and.html