【问题标题】:Apply list of functions to value using Scala Cats使用 Scala Cats 将函数列表应用于值
【发布时间】:2017-01-26 19:35:36
【问题描述】:

在 haskell 中,我可以对字符串执行以下操作

let f = sequence [id, reverse]
f "test" 

我不知道如何使用 Cats 以更好的方法来解决这个问题。我目前有类似

val f = List(fun1,fun2)
val data = "test"

f map {fun => fun(data)} 

是否有可以使用 Cats 完成此任务的 Sequence 或 SequenceU 实现?

【问题讨论】:

    标签: scala scalaz scala-cats


    【解决方案1】:

    它或多或少完全一样,只是语法有点不同,你需要一些额外的导入,而且通用版本不太方便,因为 Scala 的 String 不仅仅是一个列表的别名字符:

    import cats.instances.function._, cats.instances.list._, cats.syntax.traverse._
    
    val funcs: List[String => String] = List(identity, _.reverse)
    
    val f = funcs.sequenceU
    

    在 Haskell 中,sequence 需要一个 Traversable 实例作为其参数的外部类型构造函数,并需要一个 Monad 实例作为内部类型构造函数。 Cats 的sequence 几乎相同——Traversable 被称为Traverse(因为名称Traversable 已经被标准库占用),它需要一个Applicative 实例而不是Monad(这是一个更准确的约束——Haskell 的 sequence 由于历史原因只需要一个 monad 实例。

    如果你愿意,你可以只导入cats.implicits._,但这会带来很多其他的东西。上面的导入提供了您需要的最小类型类实例和语法扩展。

    你可以使用f,也就是String => List[String],像这样:

    scala> f("test")
    res0: List[String] = List(test, tset)
    

    请注意,如果您使用的是 2.12.1 并启用了-Ypartial-unification 编译器标志,则可以只写.sequence,而不是.sequenceU。为什么在早期的 Scala 版本中需要 U 说来话长——请参阅我的 blog post here 以获得解释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-09
      • 2015-08-25
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 2013-07-25
      • 1970-01-01
      • 2018-10-08
      相关资源
      最近更新 更多