(Die validate-Funktion hat den zusätzlichen Vorteil, anders als zip symmetrisch zu sein.)

Zu beachten ist bei andThen – genau wie in Haskell auch – dass diese Funktion zwar die gleiche Signatur hat wie ein monadisches bind beziehungsweise flatMap, aber damit keine Monade gebildet wird: andThen akkumuliert die Fehler nicht.

Fazit

Funktionale Validierung benötigt nur einen einfachen Datentyp und ein paar Methoden darauf und kommt ohne DSL oder Annotationen aus. Da „valide“ und „invalide“ durch unterschiedliche Objekte ausgedrückt wird, könnte man sie auch „objektorientierte Validierung“ nennen. Eine gute Idee ist sie allemal.

In Kotlin bringt Arrow die richtigen Abstraktionen mit, einzig an Dokumentation und Convenience fehlt es noch ein bisschen.