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?(即,根本没有提到>>=.)我想也许这可能有助于它沉入我愚蠢的大脑......
我最近偶然发现了 Kleisli 的概念,我阅读的每个教程/链接/参考都通过以下结构激发了 Kleisli 的使用:
f: a -> m[b]with g: b -> m[c]- 我认为monad 的定义已经捕捉到了这种情况 -do/bind/for/flatMap这样做。人们不必依靠 Kleisli 构造来实现这一目标。所以这不可能是 Kleisli IMO 的“主要”用例。Config 注入,则可以使用 Kleisli 构造来抽象出可重复注入。有很多方法可以实现这一点(例如implicit在 Scala 中使用s),可能不需要调用 Kleisli。同样,IMO 这并没有作为“主要”用例脱颖而出。M1[M2[M1[M2[a]]]],可以转化成[M1[M2[a]]]其可(I可能是错误的)来跨越一元边界压扁是可组合与a -> M3[b](比方说)。为此,我们可以使用 Kleisli 三元组并调用该构造,因为如果您要从头开始,您可能会重新发明Kleisli。这似乎是证明使用 Kleisli 合理的一个很好的候选者。这样对吗? …在许多文章中我都读过monad >>=运算符是一种表示函数组合的方法.但对我来说,它更接近某种高级功能应用程序
($) :: (a -> b) -> a -> b
(>>=) :: Monad m => m a -> (a -> m b) -> m b
Run Code Online (Sandbox Code Playgroud)
对于我们的构图
(.) :: (b -> c) -> (a -> b) -> a -> c
(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> a -> m c
Run Code Online (Sandbox Code Playgroud)
请澄清.
Haskell的新手,我正试图找出这个Monad的东西.monadic绑定运算符 - >>=具有非常奇特的类型签名:
(>>=) :: Monad m => m a -> (a -> m b) -> m b
Run Code Online (Sandbox Code Playgroud)
为了简化,我们替换Maybe为m:
(>>=) :: Maybe a -> (a -> Maybe b) -> Maybe b
Run Code Online (Sandbox Code Playgroud)
但请注意,该定义可以用三种不同的方式编写:
(>>=) :: Maybe a -> (Maybe a -> Maybe b) -> Maybe b
(>>=) :: Maybe a -> ( a -> Maybe b) -> Maybe b
(>>=) :: Maybe a -> ( a -> b) -> Maybe b
Run Code Online (Sandbox Code Playgroud)
在这三个中,中心的一个是最不对称的.但是,据我所知,如果我们想避免(LYAH称为样板代码),第一个有点无意义.但是,接下来的两个,我更喜欢最后一个.对于 …