Это более или менее точно то же самое, за исключением того, что синтаксис немного отличается, вам нужны дополнительные импорт, а общая версия не так удобна, так как String
Scala - это не просто псевдоним для списка символов :
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
(который является более точным ограничением-Хаскель sequence
требует только монады экземпляра для исторические причины).
Если вы хотите, можете просто импортировать 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 для объяснения.