Не удалось найти неявный в финале Scala Tagless, неявный, модульный тест - PullRequest
2 голосов
/ 09 июня 2019

Получение:

Error:(20, 5) could not find implicit value for parameter console: example.Console[F]
    new NameThing().program
Error:(20, 5) not enough arguments for constructor NameThing: (implicit evidence$1: cats.Monad[cats.package.Id], implicit console: example.Console[cats.package.Id])example.NameThing[cats.package.Id].
Unspecified value parameter console.
    new NameThing().program

Не знаю почему.

Я пытаюсь понять модульное тестирование с помощью Tagless Final

Итак, у меня есть:

case class FullName(first:String, last:String)

trait Console[F[_]] {
  def prompt:F[Unit]
  def read:F[String]
  def display(fullName: FullName):F[Unit]
}

class NameThing[F[_]: Monad](implicit console: Console[F]) {

  def program: F[Unit] = for {
    _ <- console.prompt
    rawName <- console.read
    fullName = parse(rawName)
    _ <- console.display(fullName)
  } yield ()

  def parse(rawName:String):FullName = {
    val parts = rawName.split(" ")
    FullName(parts(0), parts(1))
  }
}

И в моем модульном тесте у меня есть:

   case class TestEnv()
   type Test[A] = Reader[TestEnv, A]

   implicit object TestConsole extends Console[Test] {
      override def prompt: Test[Unit] = Reader(_ => Unit)
      override def read: Test[String] =  Reader(_ => "Joe Bloggs")
      override def display(fullName: FullName): Test[Unit] = Reader(_ => Unit)
    }

    new NameThing().program

Полный код: https://bitbucket.org/jameskingconsulting/scala-effects/src/master/

1 Ответ

2 голосов
/ 09 июня 2019

Попробуйте

new NameThing[Test]().program

Параметр типа представляется как cats.Id вместо Test.

...