Scala中基于两个Applicative乘积实现Traversable函子的编译问题
关于Scala Cats中一次遍历完成多操作的类型参数问题
问题场景
我尝试在Scala中借助Cats库遍历数据结构时同时完成两项操作,但写出的代码无法编译。
无法编译的示例代码
import cats.data.Tuple2K import cats.data.Const import cats.syntax.traverse._ List("A", "BB", "CCC").traverse[Tuple2K[[x] =>> Const[Int, x], [x] =>> Const[Int, x], Nothing], Nothing]{ case str => Tuple2K[[x] =>> Const[Int, x], [x] =>> Const[Int, x], Nothing](Const(1), Const(str.size)) }
编译错误信息
Found: cats.data.Tuple2K[[x] =>> cats.data.Const[Int, x], [x] =>> cats.data.Const[Int, x], Nothing] Required: cats.data.Tuple2K[[x] =>> cats.data.Const[Int, x], [x] =>> cats.data.Const[Int, x], Nothing][Nothing]
核心需求
仅通过一次遍历同时获取可遍历结构(示例中的列表)的大小并执行基于内容的计算,避免两次遍历。
更新说明
移除显式类型参数后,代码可正常编译并实现预期功能:
import cats.data.Tuple2K import cats.data.Const import cats.syntax.traverse._ List("A", "BB", "CCC").traverse{ case str => Tuple2K[[x] =>> Const[Int, x], [x] =>> Const[Int, x], Nothing](Const(1), Const(str.size)) } // 输出Tuple2K(Const(3),Const(6)),类型为Tuple2K[[x >: Nothing <: Any] => Const[Int, x], [x >: Nothing <: Any] => Const[Int, x], List[Nothing]]
困惑点
编译器能自行推断出正确类型,但显式传入这些类型时却无法通过编译,想知道原因。
内容的提问来源于stack exchange,提问作者user27895414
相关产品推荐
相关产品推荐

