Scala FlatMap和应用程序上下文边界产生编译错误

Scala FlatMap和应用程序上下文边界产生编译错误,scala,functional-programming,scala-cats,Scala,Functional Programming,Scala Cats,我在Scala做一些工作,遇到了隐式实例的问题。让我们考虑下面的例子: import cats.{Applicative, FlatMap, Monad} import cats.syntax.functor._ import cats.syntax.flatMap._ import cats.syntax.applicative._ class Test[F[_]: Monad] extends App{ val t1 = ().pure[F] val t2 = ().pure[F

我在Scala做一些工作,遇到了
隐式
实例的问题。让我们考虑下面的例子:

import cats.{Applicative, FlatMap, Monad}
import cats.syntax.functor._
import cats.syntax.flatMap._
import cats.syntax.applicative._


class Test[F[_]: Monad] extends App{
  val t1 = ().pure[F]
  val t2 = ().pure[F]

  def testFlatApplicative: F[Unit] =
    for{
      _ <- t1
      _ <- t2
    } yield ()
}
我希望下面的方法也能奏效

import cats.{Applicative, FlatMap, Monad}
import cats.syntax.functor._
import cats.syntax.flatMap._
import cats.syntax.applicative._


class Test[F[_]: FlatMap : Applicative] extends App{
  val t1 = ().pure[F]
  val t2 = ().pure[F]

  def testFlatApplicative: F[Unit] =
    for{
      _ <- t1
      _ <- t2
    } yield ()
}
导入猫。{Applicative,FlatMap,Monad}
导入cats.syntax.functor_
导入cats.syntax.flatMap_
导入cats.syntax.applicative_
类测试[F[3;]:FlatMap:Applicative]扩展了应用程序{
val t1=().pure[F]
val t2=()。纯[F]
def TestFlatApplication:F[单位]=
为了{

_
类测试[F[\u]:FlatMap:Applicative]
被设计为

class Test[F[_]](implicit flatMap: FlatMap[F], applicative: Applicative[F])
如果你对理解和语法进行分析,你会发现问题:

def testFlatApplicative: F[Unit] = 
  FlatMap[F].flatMap(t1)(_ => 
    Functor[F].map(t2)(_ => ())
  )

Error: ambiguous implicit values:
 both value applicative in class Test of type cats.Applicative[F]
 and value flatMap in class Test of type cats.FlatMap[F]
 match expected type cats.Functor[F]
因此,您可以手动解决歧义:

def testFlatApplicative: F[Unit] = 
  FlatMap[F].flatMap(t1)(_ => 
    applicative.map(t2)(_ => ())
  )

在编写
类测试[F[\u]:Monad]
时不存在这样的问题,因为您使用了单隐式

def testFlatApplicative: F[Unit] = 
  FlatMap[F].flatMap(t1)(_ => 
    Functor[F].map(t2)(_ => ())
  )

Error: ambiguous implicit values:
 both value applicative in class Test of type cats.Applicative[F]
 and value flatMap in class Test of type cats.FlatMap[F]
 match expected type cats.Functor[F]
def testFlatApplicative: F[Unit] = 
  FlatMap[F].flatMap(t1)(_ => 
    applicative.map(t2)(_ => ())
  )
def testFlatApplicative: F[Unit] = 
  FlatMap[F].flatMap(t1)(_ => 
    flatMap.map(t2)(_ => ())
  )