Da Free
in Scalaz 7.1.5 keine Monad-Instanz ist, kann ich keine sinnvolle Methode verwenden, die in Applicative
, Apply
usw. definiert ist.Warum ist Free nicht Monad Instanz in Scalaz 7.1.5?
/* ref - http://tpolecat.github.io/assets/sbtb-slides.pdf */
import Free._, Coyoneda._
type ResultSetIO[A] = FreeC[ResultSetOp, A]
val next : ResultSetIO[Boolean] = liftFC(Next)
def getString(index: Int): ResultSetIO[String] = liftFC(GetString(index))
def getInt(index: Int) : ResultSetIO[Int] = liftFC(GetInt(index))
def close : ResultSetIO[Unit] = liftFC(Close)
// compile errors
def getPerson1: ResultSetIO[Person] =
(getString(1) |@| getInt(2)) { Person(_, _)}
def getNextPerson: ResultSetIO[Person] =
next *> getPerson
def getPeople(n: Int): ResultSetIO[List[Person]] =
getNextPerson.replicateM(n) // List.fill(n)(getNextPerson).sequence
die erorr Nachricht ist,
Error:(88, 19) value |@| is not a member of free.JDBC.ResultSetIO[String]
(getString(1) |@| getInt(2)) { Person(_, _)}
^
Error:(91, 10) value *> is not a member of free.JDBC.ResultSetIO[Boolean]
next *> getPerson
^
Error:(94, 19) value replicateM is not a member of free.JDBC.ResultSetIO[free.Person]
getNextPerson.replicateM(n) // List.fill(n)(getNextPerson).sequence
^
Soll ich für Free
Monade Instanz implementieren?
implicit val resultSetIOMonadInstance = new Monad[ResultSetIO] {
override def bind[A, B](fa: ResultSetIO[A])(f: (A) => ResultSetIO[B]): ResultSetIO[B] =
fa.flatMap(f)
override def point[A](a: => A): ResultSetIO[A] =
Free.point[CoyonedaF[ResultSetOp]#A, A](a)
}
Oder fehlt mir etwas? (z. B. Import)
Oh, und noch eins: 4. Upvote SI-5075, drücken Sie die Daumen, und warten Sie weitere vier oder fünf Jahre ... –
Vielen Dank für die ausführliche Erklärung und nützliche andere Alternativen. Ich möchte den ersten Weg wählen, da Scalaz 7.2.x kein 'FreeC' hat. – 1ambda