就OOP程序员所理解的而言(没有任何函数编程背景),monad是什么?
它解决了什么问题,它使用的最常见的地方是什么?
编辑:
为了澄清我一直在寻找的理解,让我们假设您正在将具有monad的FP应用程序转换为OOP应用程序.你会怎么做把monad的职责移植到OOP应用程序?
大多数教程似乎提供了很多monad(IO,状态,列表等)的例子,然后期望读者能够抽象出整体原则,然后他们提到类别理论.通过尝试从例子中进行概括,我不会学得很好,我想从理论的角度理解为什么这种模式如此重要.
从这个线索来看: 任何人都可以解释Monads吗? 这是一个常见的问题,我已经尝试查看大多数建议的教程(除了我的linux机器上不能播放的Brian Beck视频):
有没有人知道从类别理论开始的教程,并用这些术语解释IO,状态,列表monad?以下是我未能成功的尝试:
据我所知,monad包含一个三元组:一个endo-functor和两个自然变换.
仿函数通常显示类型:(a - > b) - >(ma - > mb)我包括第二个括号只是为了强调对称性.
但是,这是一个endofunctor,所以域和codomain不应该像这样吗?:
(a - > b) - >(a - > b)
我认为答案是域和codomain都有一种类型:
(a - > b)| (ma - > mb)| (mma - > mmb)等......
但我不确定这是否有效或符合给定的仿函数的定义?
当我们继续进行自然变革时,它会变得更糟.如果我理解正确,自然变换是二阶函子(具有某些规则),它是从一个仿函数到另一个仿函数的仿函数.因为我们已经定义了上面的仿函数,一般类型的自然变换将是:((a - > b) - >(ma - > mb)) - >((a - > b) - >(ma - > mb ))
但是我们使用的实际自然变换有类型:
a - > ma
ma - >(a - > mb) - > mb
这些一般形式的子集是否在上面?为什么它们会自然变换?
马丁
我们中的许多人没有函数式编程的背景知识,更不用说类别理论代数了.所以我们假设我们需要并因此创建一个类似的泛型类型
data MySomething t = .......
Run Code Online (Sandbox Code Playgroud)
然后我们继续编程,并使用MySomething.什么证据应提醒我们,MySomething是一个单子,那我们必须通过写能使之instance Monad MySomething ...和定义return,并>>=为它?
谢谢.
编辑:另见这个问题:链接操作是monad类解决的唯一问题吗?,这个答案monad是一个带辅助操作的函数数组
这是Haskell中众所周知的>> =运算符的签名
>>= :: Monad m => m a -> (a -> m b) -> m b
Run Code Online (Sandbox Code Playgroud)
问题是为什么函数的类型是
(a -> m b)
Run Code Online (Sandbox Code Playgroud)
代替
(a -> b)
Run Code Online (Sandbox Code Playgroud)
我会说后者更实用,因为它允许在定义的monad中直接集成现有的"纯"函数.
相反,编写一般的"适配器"似乎并不困难
adapt :: (Monad m) => (a -> b) -> (a -> m b)
Run Code Online (Sandbox Code Playgroud)
但无论如何,我认为更可能是你已经有了(a -> b)替代(a -> m b).
注意.我通过"实际"和"可能"来解释我的意思.如果你还没有在程序中定义任何monad,那么,你拥有的函数是"纯粹的" (a -> b),你将拥有0类型的函数,(a -> m b)因为你还没有定义m.如果那时你决定定义一个monad,m那就需要a -> m b定义新的函数.