gpt4 book ai didi

scala - 使用 Scala Cats 将函数列表应用于值

转载 作者:行者123 更新时间:2023-12-05 00:52:58 25 4
gpt4 key购买 nike

在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 的 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内部类型构造函数的实例。猫的 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 .为什么需要 U在早期的 Scala 版本上是一个很长的故事——见我的 blog post here为解释。

关于scala - 使用 Scala Cats 将函数列表应用于值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41881533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com