使用猫库

时间:2017-08-01 07:23:58

标签: scala applicative scala-cats

这是我之前的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编写它?

1 个答案:

答案 0 :(得分:1)

首先是一些定义

import cats._, implicits._
val as = List(1, 2)
val bs = List("a", "b")

Curried funciton

如果你有咖喱功能,例如

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