2017-01-26 14 views
4

в Haskell я мог бы сделать следующее в строкусписок функций Применить, чтобы оценить с помощью Scala Кошки

let f = sequence [id, reverse] 
f "test" 

Я на немного потери, как подойти к этому в лучшем методе с использованием кошек. Я в настоящее время есть что-то вроде

val f = List(fun1,fun2) 
val data = "test" 

f map {fun => fun(data)} 

Есть ли реализации последовательности или SequenceU, которые могут сделать это, используя кошек?

ответ

5

Это более или менее точно то же самое, за исключением того, что синтаксис немного отличается, вам нужны дополнительные импорт, а общая версия не так удобна, так как 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 для объяснения.

 Смежные вопросы

  • Нет связанных вопросов^_^