使用函数作为应用程序 functors/cartesians
Using functions as applicative functors/cartesians
我正在为此使用 cats
库。
使用它们的应用仿函数实例(或 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
这仅在启用 partial-unification
时有效。
最简单的方法是添加 sbt-partial-unification
plugin.
如果您使用的是 Scala 2.11.9 或更新版本,您还可以简单地添加编译器标志:
scalacOptions += "-Ypartial-unification"
我正在为此使用 cats
库。
使用它们的应用仿函数实例(或 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
这仅在启用 partial-unification
时有效。
最简单的方法是添加 sbt-partial-unification
plugin.
如果您使用的是 Scala 2.11.9 或更新版本,您还可以简单地添加编译器标志:
scalacOptions += "-Ypartial-unification"