【发布时间】:2021-07-28 12:02:27
【问题描述】:
我正在尝试了解免费 monad 的工作方式。
在此期间,我进入 Free 的 monad 实例,即:
data Free f a = Pure a | Free (f (Free f a))
instance (Functor f) => Monad (Free f) where
return = Pure
Pure a >>= k = k a
Free m >>= k = Free ((>>= k) <$> m)
知道
-- k :: a -> Free f b
-- m :: f (Free f a)
-- fmap :: Functor f => (a -> b) -> f a -> f b
-- (>>=) :: Free f a -> (a -> Free f b) -> Free f b
我无法理解这是如何工作的
Free ((>>= k) <$> m)
首先>>= k 怎么可能? k 是一个函数,>>= 的第一个参数不是。这就像它绕过第一个参数并将k 作为第二个参数离开Free f a -> Free f b
谁能帮助我更好地理解这一点?谢谢!
【问题讨论】:
-
是的,这就是函数切片。 ‘(2.0 /)’ 是一个将 2 除以其参数的函数。 '(/2.0)' 是一个将其参数除以 2 的函数。
-
谢谢@bisserlis 就是这样!
-
为了完整起见,
((/) 2.0)是应用2.0作为/的第一个参数的方式。这是一个普通的应用程序,而不是一个部分,并且不同于(/ 2.0)是一个部分(并将2.0作为第二个参数传递。此部分适用于任何中缀运算符,除了特殊情况(- 2.0)涉及一元减号运算符(不是二进制减法)并且不形成一个部分。
标签: haskell syntax operators monads free-monad