Реализация withFilter при написании пользовательской монады в scala - PullRequest
0 голосов
/ 03 апреля 2020

Я не могу реализовать монаду для составления функции. Выдает ошибку для понимания того, что «значение withFilter не является членом MonadFunctionComposition.Writer»

object MonadFunctionComposition extends App {

  case class Writer(value1: Int, value2: Int, logs: String) {

    def map(x : (Int, Int) => Int): Writer = {
      Writer( x(value1, value2), x(value1, value2), logs)
    }

    def flatMap(x: (Int, Int) => Writer): Writer = {
      val temp = x(value1, value2)
      val temp1 = x(value2, value2)
      Writer(temp.value1, temp1.value2, logs + "..." + temp.logs)
    }
  }

  val f: (Int, Int) => Writer = (value1, value2) => {
    Writer(value1 + 57, value2 - 2, s"execute function f with $value1 $value2 value.")
  }

  val g: (Int, Int) => Writer = (value1, value2) => {
    Writer(value1 + 10, value2 - 1, s"execute function g with $value1 $value2 value.")
  }

  val result = for
  {
    (a,x) <- g(5, 100)
    b <- f(a,x)
  } yield b

 // val result = g(5, 100).flatMap((a,b) => f(a, b))
  println(s"Result $result")

}

1 Ответ

2 голосов
/ 03 апреля 2020

Не думайте, что в этом случае можно иметь полезную реализацию withFilter.

Ваша Writer не является монадой. Во-первых, чтобы быть монадой, она должна быть обобщенной c (Writer[T]).

Во-вторых, map и flatMap должны иметь правильные подписи:

def map[B](f: T => B): Writer[B]
def flatMap[B](f: T => Writer[B]): Writer[B]

Это Удивительно, что компилятор не выдает ошибку в вашем случае.

И тогда вы можете подумать о добавлении withFilter метода: def withFilter(p: T => Boolean): Writer[T] Но что он должен делать?

Конечно, тривиальная реализация, которая ничего не делает и возвращает this. Также возможно сбросить журнал, если p(this) равен false, но это не то, чего ожидают люди.

Возможность фильтрации по значению monadi c закодирована в классе типов MonadPlus. И ни Scalaz / Cats, ни Haskell не реализуют MonadPlus для Writer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...