在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
内部类型构造函数的实例.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版本是一个很长的故事 - 请参阅我的博客文章,以获得解释.