[英]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
表达式直接转换为cats as
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")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.