【问题标题】:Understanding the use of bind in free monad理解 free monad 中 bind 的使用
【发布时间】: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)

首先&gt;&gt;= k 怎么可能? k 是一个函数,&gt;&gt;= 的第一个参数不是。这就像它绕过第一个参数并将k 作为第二个参数离开Free f a -&gt; 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


【解决方案1】:

我不知道这个Free 到底是什么,但我们都知道

(>>= k) <$> m == fmap (>>= k) m

所以如果m == f sth,那么

fmap (>>= k) m == f ((>>= k) sth) == f (sth >>= k)

所以一切似乎都在进行类型检查。

正如评论中所建议的那样,您可能唯一错过的是(.op. y) 将y 作为第二个参数传递给.op.,这与(.op.) y 不同,后者将其作为第一个参数传递。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 2018-02-09
    相关资源
    最近更新 更多