Что у вас есть (упрощение):
val f: A => (B, M[C]) //M is a Functor
val g: C => C
Я могу придумать несколько способов сделать это. Я думаю, что я предпочитаю:
(a: A) => g.lift[M].second apply f(a)
Или также:
(a: A) => f(a) :-> g.lift[M]
Однако, возможно, существует pointfree способ - хотя и не обязательно, конечно,
lift
- это метод на Function1W
, который поднимает функцию в область функтора M
second
- это метод MAB
, который применяет функцию к правой стороне Bifunctor
:->
- метод, доступный для Bifunctors
, обозначающий применение функции к rhs.
РЕДАКТИРОВАТЬ - отсутствующий фактор представляется правильным в высказывании f andThen g.lift[M].second
работает:
scala> import scalaz._; import Scalaz._
import scalaz._
import Scalaz._
scala> case class A(); case class B(); case class C()
defined class A
defined class B
defined class C
scala> lazy val f: A => (B, List[C]) = sys.error("")
f: A => (B, List[C]) = <lazy>
scala> lazy val g: C => C = sys.error("")
g: C => C = <lazy>
Pointfree:
scala> lazy val h = f andThen g.lift[List].second
h: A => (B, List[C]) = <lazy>