使用猫库的应用样式

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")