Предположим, есть черта с абстрактными методами, имеющими разные сигнатуры (см. Ниже).Чтобы включить для понимания, я мог бы определить одну и ту же сигнатуру Result[A]
для каждого абстрактного метода.
Однако, чтобы упростить подклассы черты, я хотел бы сохранить более простые подписи для методов 2 и 3.
import cats.data.{EitherT, Reader}
trait Domain{
type Read[A] = Reader[BoundsProblem, A]
type Result[A] = EitherT[Read, String, A]
def stepSize( s: State, direction: Direction): Result[Double] //depends on an injected context, can fail
def takeStep( s: State, dir: Direction, stepSize: Double): Read[Variable] //depends on context, can't fail
def calculate(x: Variable): (Double, Gradient) //context-independent, can't fail
//doesn't compile:
def iteration(s: State, dir: Direction) = for{
tee <- stepSize(s, dir)
x <- takeStep(s, dir, tee)
r <- calculate(x)
} yield r
}
Мой вопрос заключается в том, как это можно сделать в Cats.(Мои попытки поднять takeStep
до EitherT[Read, String, A]
не увенчались успехом.) Или мне лучше просто определить одно и то же Result[A]
для каждого метода?