当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用ScalaCats将函数列表应用于值》经验,为你挑选了1个好方法。

在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的实现?



1> Travis Brown..:

它或多或少完全相同,除了语法稍有不同,你需要一些额外的导入,并且通用版本不方便,因为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(这是一个更准确的约束 - sequence由于历史原因,Haskell 只需要一个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版本是一个很长的故事 - 请参阅我的博客文章,以获得解释.

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有