如何用匿名函数创建FunctionK实例?Scala编译报错求解
FunctionK实例创建的编译错误分析与解决
问题本质
这是Scala编译器类型推断的局限性导致的,并非匿名函数使用方式有误。FunctionK[F[_], G[_]]的核心方法是def apply[A](fa: F[A]): G[A],它是多态方法(针对任意类型参数A)。当你用无参数类型标注的偏函数赋值给Option ~> List类型时,编译器无法自动推断出偏函数的参数是Option[A],也就无法关联到FunctionK的多态apply方法,最终导致类型推断失败。
解决方案
方案1:显式指定匿名函数的参数类型
给匿名函数的参数加上类型标注,让编译器明确参数是Option[A]:
import cats.~> given (Option ~> List) = { (fa: Option[A]) => fa match case Some(a) => a :: Nil case None => Nil }
或者利用Option自带的toList方法简化代码:
import cats.~> given (Option ~> List) = (fa: Option[A]) => fa.toList
方案2:使用FunctionK.lift方法
Cats提供了FunctionK.lift工具方法,它可以直接接收一个[A] => F[A] => G[A]类型的函数,并自动转换成FunctionK实例,无需手动处理类型标注:
import cats.~> import cats.arrow.FunctionK given (Option ~> List) = FunctionK.lift(_.toList)
内容的提问来源于stack exchange,提问作者Max Smirnov
相关产品推荐
相关产品推荐

