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?(即,根本没有提到>>=.)我想也许这可能有助于它沉入我愚蠢的大脑......
实际上,标题就是这么说的.我无法理解为什么以下代码实际上不打印"Hello World"而不是什么>>=.
main = fmap putStrLn getLine
Run Code Online (Sandbox Code Playgroud)
目前,这是我的推理,请检查它是否有任何谬误.
如果我们比较fmap有>>=
(>>=) :: Monad m => m a -> (a -> m b) -> m b
fmap :: Functor f => (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)
在绑定,上下文或IO术语"世界"中,第一个m和第二个m除了类型之外完全不同.(a -> m b)基本上重新创造了一个新的"世界".在Functor中不是这样,上下文f是相同的,因此副作用是不可能的.
现在,如果确实如此,为什么当我们尝试对fmap现有的IO Monad进行有效的IO 时,编译器不会发出警告?