Last active
August 29, 2015 14:04
-
-
Save yujikiriki/3d1b98342de4ddc78c44 to your computer and use it in GitHub Desktop.
Hay alguna forma de hacerlo mejor?
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
case class OrderIncomeReportEntry( month: String, value: Double ) | |
private def sumValues( entries: List[ OrderIncomeReportEntry ] ): List[OrderIncomeReportEntry] = { | |
val byMonth: Map[ String, List[ OrderIncomeReportEntry ] ] = entries.groupBy( e => e.month ) | |
byMonth.foldLeft( List[OrderIncomeReportEntry]() ) { | |
( list, value ) => | |
val sum = value._2.foldLeft( 0.0 )( ( acc, oire ) => acc + oire.value ) | |
list.+:( OrderIncomeReportEntry( value._1, sum ) ) | |
} | |
} | |
Rpta: [{"order":{"month":"08"},"value":200.0},{"order":{"month":"01"},"value":100.0}] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Señores, me tomó más de 6 meses ponerme al día para poder dar una respuesta al post laaaaaaargo de Vilá. Sin embargo, algunas observaciones de lo que me respondió a la solución propuesta en ese momento:
Dado el escenario propuesto, pienso que el monoide al tener efecto sólo sobre el campo "value" omite, sin sacrificar la semántica del problema, el campo "month".
Siendo así, creo que en vez de concentrarse en modelar en un ADT los meses como en su ejemplo final
yo me habría concentrado en modelar el campo "value" como un ADT. Algo así:
y haber creado el monoide sobre
Money
:La cosa que me queda en duda y que no se si se podría hacer es que, dado que partimos de un
OrderIncomeReportEntry
poder meter dentro de unlense
sobreOrderIncomeReportEntry
esa suma deMoney
s.Otra opción podría ser crear un tipo genérico "sumable" y crearle su monoide, que la final de cuentas termina siendo nada más que un Monoid[Double] o algo así...
Por otro lado y viendo su propuesta de semigrupos, dado que monoide es "hijo" de semigrupo y que monoide sólo agrega identidad a semigrupo, es tentador dejarlo en términos de semigrupo; solución que quizás sea la que más me convence.