这是我之前的question:
的后续内容假设我想使用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
编写它?
答案 0 :(得分:1)
首先是一些定义
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")