在许多文章中我都读过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,但我理解Monads的概念.
我被Kleisli三重混淆了,然而,类别,
虽然Haskell中在返回和绑定功能方面限定单子,但也可以在以下方面,以限定一个单子
return和其它两个操作,join和fmap.该公式更符合类别理论中monad的原始定义.fmap具有类型的操作(t ? u) ? M t ? M u在两种类型之间采用函数,并生成一个函数,该函数对monad中的值执行"相同的操作".该join类型的操作将M (M t) ? M t两层monadic信息"扁平"为一层.
帮助我了解Monads的背景原理.
这两个配方的相关内容如下:
fmap f m = m >>= (return . f)
join n = n >>= id
fmap :: (a -> b) -> (m a -> m b)
unit :: a -> m a
join :: m (m a) -> m a
>>= :: m a -> …Run Code Online (Sandbox Code Playgroud) 我对(>>=)Haskell中绑定函数的定义有一些疑问.
因为Haskell是一种纯语言,所以我们可以使用Monad来处理带副作用的操作.我认为这个策略是有点像把所有的动作可能会引起副作用另一个世界,我们可以从"纯"哈斯克尔世界虽然控制它们do或>>=.
所以当我看一下>>=函数的 定义时
(>>=) :: Monad m => m a -> (a -> m b) -> m b
Run Code Online (Sandbox Code Playgroud)
它需要一个(a -> m b)函数,因此m a前一个动作的结果可以"解包"到非monadic a中>>=.然后,该功能(a -> m b)需要a作为其输入和返回另一个单子m b作为其结果.通过绑定功能,我可以对monadic进行操作,而不会给纯haskell代码带来任何副作用.
我的问题是为什么我们使用一个(a -> m b)函数?在我看来,一个m a -> m b函数也可以做到这一点.有什么理由,还是因为它的设计是这样的?
编辑
从意见,我知道这是很难提取a的m a.但是,我认为我可以将monadic m a视为a副作用.
是否有可能假设函数m a -> m b …