使用函数作为applicative functor / cartesians

时间:2017-10-04 10:41:26

标签: scala scala-cats

我正在使用cats lib。

使用他们的应用程序仿函数实例(或准确地说是Cartesian)组合两个列表很容易:

import cats._
import cats.implicits._

(List(23, 4), List(55, 56)).mapN(_ + _)
>> List(78, 79, 59, 60)

但是,我似乎无法用两个功能做同样的事情:

val strLength: String => Int = _.length

(strLength, strLength).mapN(_ + _)
>> value mapN is not a member of (String => Int, String => Int)

如果我明确地执行了一些隐式转换,并且如果我创建了一个类型别名来为编译器提供帮助,它确实有效:

type F[A] = Function1[String, A]
val doubleStrLength = catsSyntaxTuple2Cartesian[F, Int, Int]((strLength, strLength)).mapN(_ + _)

doubleStrLength("hello")
>> 10

有更简单的方法吗?似乎过于冗长

编辑:如果你想玩它,我在这里创建一个工作表:https://scastie.scala-lang.org/dcastro/QhnD8gwEQEyfnr14g34d9g/2

1 个答案:

答案 0 :(得分:6)

仅当您启用partial-unification时才有效。 最简单的方法是添加sbt-partial-unification plugin

如果你使用的是Scala 2.11.9或更高版本,你也可以简单地添加编译器标志:

scalacOptions += "-Ypartial-unification"