使用猫库的应用样式
Applicative style using cats library
这是我之前 :
的后续
假设我想使用 Applicative
将函数 A => B => C
应用到 List[A]
和 List[B]
.
我相信它看起来像 Haskell:
pure f <*> as <*> bs // apply f to List[A] and List[B]
或
f <$> as <*> bs
cats
是否提供这样的语法? cats
怎么写?
先定义一些
import cats._, implicits._
val as = List(1, 2)
val bs = List("a", "b")
咖喱函数
如果你有柯里化函数,例如
val f = (i: Int) => (s: String) => Vector.fill(i)(s).mkString("")
则pure f <*> as <*> bs
表达式直接翻译成猫为
f.pure[List].ap(as).ap(bs)
并且f <$> as <*> bs
变为
as.map(f).ap(bs)
是的,顺序不再那么自然了。
非科里化函数
在 Scala 中,您经常会处理带有多个参数的函数:
val f2 = (i: Int, s: String) => Vector.fill(i)(s).mkString("")
// or val f2 = Function.uncurried(f)
对于这些,cats
提供了 CartesianBuilder
语法:
(as |@| bs).map(f2)
或者,在较新的版本中,使用 map#
方法的元组语法(可能会重命名,IIRC)
(as, bs).map2(f2)
所有这些片段的计算结果为 List("a", "b", "aa", "bb")
这是我之前
假设我想使用 Applicative
将函数 A => B => C
应用到 List[A]
和 List[B]
.
我相信它看起来像 Haskell:
pure f <*> as <*> bs // apply f to List[A] and List[B]
或
f <$> as <*> bs
cats
是否提供这样的语法? cats
怎么写?
先定义一些
import cats._, implicits._
val as = List(1, 2)
val bs = List("a", "b")
咖喱函数
如果你有柯里化函数,例如
val f = (i: Int) => (s: String) => Vector.fill(i)(s).mkString("")
则pure f <*> as <*> bs
表达式直接翻译成猫为
f.pure[List].ap(as).ap(bs)
并且f <$> as <*> bs
变为
as.map(f).ap(bs)
是的,顺序不再那么自然了。
非科里化函数
在 Scala 中,您经常会处理带有多个参数的函数:
val f2 = (i: Int, s: String) => Vector.fill(i)(s).mkString("")
// or val f2 = Function.uncurried(f)
对于这些,cats
提供了 CartesianBuilder
语法:
(as |@| bs).map(f2)
或者,在较新的版本中,使用 map#
方法的元组语法(可能会重命名,IIRC)
(as, bs).map2(f2)
所有这些片段的计算结果为 List("a", "b", "aa", "bb")