Подъемные функции для монадных трансформеров у кошек Scala - PullRequest
0 голосов
/ 11 октября 2018

Предположим, есть черта с абстрактными методами, имеющими разные сигнатуры (см. Ниже).Чтобы включить для понимания, я мог бы определить одну и ту же сигнатуру 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] для каждого метода?

1 Ответ

0 голосов
/ 11 октября 2018

Попробуйте

def iteration(s: State, dir: Direction): Result[(Double, Gradient)] =  for{
  tee <- stepSize(s, dir)
  x   <- EitherT.right(takeStep(s, dir, tee))
  r   = calculate(x)
} yield r

или

def iteration(s: State, dir: Direction): Result[(Double, Gradient)] =  for{
  tee <- stepSize(s, dir)
  x   <- EitherT.right(takeStep(s, dir, tee))
} yield calculate(x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...