如何指定抽象类型必须在 scalaz 中实现某些类型类?

How to specify that abstract types must implement certain typeclasses in scalaz?

我想编写一个简单地将两个 monad 绑定在一起的函数,而无需预先确定 monad 的确切类型(列表、状态 monad 等)。在我看来,这种通用性是类型类如此强大的原因,我应该能够用 Scalaz 做到这一点。这是我的想法:

def f[F[_], A](m1: F[A], m2: F[A]): F[(A,A)] = 
  m1 >>= { a: A => m2.map{ b: A => (a,b) }}

如何指定 F[_] 必须实现 Monad 类型类以便我可以在我的函数中使用 >>=?写 F[_] <: Monad 似乎不是正确的方法,因为 State、List 等类型......它们是 monad 不扩展 Monad 特征。

听起来上下文边界正是您要查找的内容。 f[F[_] : Monad... 参见 What are Scala context and view bounds?