Monad通常用return和来解释bind.不过,我猜想你也可以实现bind在以下方面join(和fmap?)
在缺乏一流功能的编程语言中,使用起来bind非常难以捉摸.join另一方面,看起来很容易.
但是,我并不完全确定我理解它是如何join运作的.显然,它有[Haskell]类型
join :: Monad m => m (m x) -> m x
对于monad列表,这显然很简单concat.但是对于一般的monad来说,这种方法在操作上实际上做了什么?我看到它对类型签名的作用,但我试图弄清楚我是如何在Java或类似的东西中写出这样的东西.
(实际上,这很容易:我不会.因为仿制药已经坏了.;-)但原则问题仍然存在......)
哎呀.看起来之前有人问过:
可能有人勾画出使用普通的单子一些实现return,fmap和join?(即,根本没有提到>>=.)我想也许这可能有助于它沉入我愚蠢的大脑......
Monad在理论上被认为是仿函数的一个子集,特别是应用仿函数,尽管它没有在Haskell的类型系统中指出.
知道这一点,给出一个monad并基于return以及bind如何:
fmap,<*>?我是一个有点经验的函数式程序员,但我一直对声明 \xe2\x80\x9cA monad is just a monoid in the Category of endofunctors\xe2\x80\x9d 以及 Haskell 中 monads/functors 的实际实现感到困惑其他函数式语言。
\n根据 Haskell Wiki,\n https://wiki.haskell.org/Functor
\nclass Functor f where\n fmap :: (a -> b) -> f a -> f b\n (<$) :: a -> f b -> f a\nRun Code Online (Sandbox Code Playgroud)\n函子必须保留恒等态射
\nfmap id = id\nRun Code Online (Sandbox Code Playgroud)\n函子保留态射的组成
\nfmap (f . g) == fmap f . fmap g\nRun Code Online (Sandbox Code Playgroud)\n我很明白这一点,所以不需要进一步解释;然而,当我们使用 monad 运算符时>>=,现在我们有了 Monad 实现和 Monad 法则
monads haskell functional-programming functor category-theory