如何将函数应用于矩阵?
How to apply a function to a matrix?
这是我之前
的后续
现在我知道 cats
为 Vector
提供了 Apply
的实例。所以我可以写:
import cats.implicits._
scala> val f: Int => Int = _ + 2
f: Int => Int = <function1>
scala> Vector(f) ap Vector(1, 2, 3)
res18: scala.collection.immutable.Vector[Int] = Vector(3, 4, 5)
现在我想知道如何将 f
应用于定义为 Vector[Vector[Int]
的矩阵的所有元素。 cats
是否提供矩阵的 Apply
实例?
为了在 Vector[Vector[Int]]
上使用 ap
,您需要将 f
提升到 Vector[Vector[A => B]]
。一种可能的方法是:
import cats.Apply
import cats.implicits._
val f: Int => Int = _ + 2
val vectorOfVectors = Apply[Vector] compose Apply[Vector]
val vec = Vector(Vector(1,2), Vector(3,4))
val res: Vector[Vector[Int]] = vectorOfVectors.ap(Vector(Vector(f)))(vec)
产量:
Vector(3, 4)
Vector(5, 6)
IMO 更好的方法是使用 Nested
:
在build.sbt
中使用kind-projector
:
addCompilerPlugin("org.spire-math" %% "kind-projector" % "0.9.4")
然后:
import cats.Functor
import cats.data.Nested
import cats.implicits._
val f: Int => Int = _ + 2
val vec = Vector(Vector(1,2), Vector(3,4))
val nested: Nested[Vector, Vector, Int] = Nested(vec)
val res: Nested[Vector, Vector, Int] = Functor[Nested[Vector, Vector, ?]].map(nested)(f)
val result: Vector[Vector[Int]] = res.value
请注意如何使用 Nested
意味着我们可以应用 f
而根本没有提升。
这是我之前
现在我知道 cats
为 Vector
提供了 Apply
的实例。所以我可以写:
import cats.implicits._
scala> val f: Int => Int = _ + 2
f: Int => Int = <function1>
scala> Vector(f) ap Vector(1, 2, 3)
res18: scala.collection.immutable.Vector[Int] = Vector(3, 4, 5)
现在我想知道如何将 f
应用于定义为 Vector[Vector[Int]
的矩阵的所有元素。 cats
是否提供矩阵的 Apply
实例?
为了在 Vector[Vector[Int]]
上使用 ap
,您需要将 f
提升到 Vector[Vector[A => B]]
。一种可能的方法是:
import cats.Apply
import cats.implicits._
val f: Int => Int = _ + 2
val vectorOfVectors = Apply[Vector] compose Apply[Vector]
val vec = Vector(Vector(1,2), Vector(3,4))
val res: Vector[Vector[Int]] = vectorOfVectors.ap(Vector(Vector(f)))(vec)
产量:
Vector(3, 4)
Vector(5, 6)
IMO 更好的方法是使用 Nested
:
在build.sbt
中使用kind-projector
:
addCompilerPlugin("org.spire-math" %% "kind-projector" % "0.9.4")
然后:
import cats.Functor
import cats.data.Nested
import cats.implicits._
val f: Int => Int = _ + 2
val vec = Vector(Vector(1,2), Vector(3,4))
val nested: Nested[Vector, Vector, Int] = Nested(vec)
val res: Nested[Vector, Vector, Int] = Functor[Nested[Vector, Vector, ?]].map(nested)(f)
val result: Vector[Vector[Int]] = res.value
请注意如何使用 Nested
意味着我们可以应用 f
而根本没有提升。