Простой способ применить список функций к значению
Предположим, у меня есть список функций List[A => B]
и нужна функция, которая возвращает List[B]
для данного значения типа A
:
def foo[A, B](fs: List[A => B]): A => List[B] = a => fs.map(_.apply(a))
Есть ли что-нибудь попроще (может быть, с cats
) способ написать List[A => B] => A => List[B]
?
2 ответа
Решение
Как отмечает @Oleg, вы можете использовать Applicative
чтобы сгенерировать функцию:
import cats.implicits._
def foo[A, B](fs: List[A => B]): A => List[B] = a => fs ap List(a)
Хотя я не думаю, что это имеет большое значение в данном конкретном случае.
Подписьf (a -> b) -> a -> f b
предлагает использоватьflap
(из Хаскеля).
Начиная с 2.9.0 вы можете использовать его аналог в Кошках по имениmapApply
.
import cats.implicits._
def foo[A, B](fs: List[A => B]): A => List[B] = a => fs.mapApply(a)