加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:09:16 所属栏目:安全 来源:网络整理
导读:在 haskell中,我可以对字符串执行以下操作 let f = sequence [id,reverse]f "test" 如果使用Cats更好的方法来解决这个问题,我有点不知所措.我现在有类似的东西 val f = List(fun1,fun2)val data = "test"f map {fun = fun(data)} 是否可以使用Cats实现Sequen
在 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序列中,需要一个Traversable实例作为其参数的外部类型构造函数,并且需要一个Monad实例作为内部类型构造函数. Cats的序列几乎相同 – Traversable称为Traverse(因为名称Traversable已被标准库占用),它需要Applicative实例而不是Monad(这是一个更准确的约束–Haskell的序列只需要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以获得解释.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读