7 Stimmen

Scalaz Kleisli Frage

Es gibt eine trait genannt. Kleisli im scalaz Bibliothek. Schauen Sie sich den Code an:

import scalaz._
import Scalaz._
type StringPair = (String, String)

val f: Int => List[String]        = (i: Int) => List((i |+| 1).toString, (i |+| 2).toString)
val g: String => List[StringPair] = (s: String) => List("X" -> s, s -> "Y")

val k = kleisli(f) >=> kleisli(g) //this gives me a function: Int => List[(String, String)]

Aufrufen der Funktion k mit dem Wert von 2 ergibt:

println( k(2) ) //Prints: List((X,3), (3,Y), (X,4), (4,Y))

Meine Frage ist: wie würde ich Scalaz verwenden, um f und g zu kombinieren, um eine Funktion m zu erhalten, so dass die Ausgabe von m(2) wäre:

val m = //??? some combination of f and g
println( m(2) ) //Prints: List((X,3), (X,4), (3,Y), (4,Y))

Ist das überhaupt möglich?

3voto

Apocalisp Punkte 34088

Es scheint, als wollten Sie transpose . Scalaz bietet dies nicht an, aber es sollte einfach zu schreiben sein. Die Funktion m die Sie wünschen, ist val m = f andThen (_.map(g)) andThen transpose andThen (_.join)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X