繁体   English   中英

使用猫库的适用风格

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM