import Data.Monoid
outputList :: Int -> Int -> [Maybe Int]
outputList = mconcat [getRow, getColumn, getBlock]
Se merecen una explicación.
Primero, señalaré explícitamente que todas estas funciones tienen el mismo tipo.
outputList, getRow, getColumn, getBlock :: Int -> Int -> [Maybe Int]
Ahora vamos a empezar con su definición original.
outputList x y = concat . map ($ y) $ map ($ x) [getRow,getColumn,getBlock]
Estas funciones resultan en una [Maybe Int]
, y una lista de todo es un monoide. La combinación de listas monoidales es lo mismo que concatenar las listas, por lo que podemos reemplazar concat
con mconcat
.
outputList x y = mconcat . map ($ y) $ map ($ x) [getRow,getColumn,getBlock]
Otra cosa que es un monoide es una función, si su resultado es un monoide. Es decir, si b
es un monoide, entonces a -> b
también es un monoide. Las funciones de combinación monoidales son lo mismo que llamar a las funciones con el mismo parámetro, y luego combinar los resultados de manera monoidal.
así podemos simplificar a
outputList x = mconcat $ map ($ x) [getRow,getColumn,getBlock]
Y luego otra vez a
outputList = mconcat [getRow,getColumn,getBlock]
Hemos terminado!
El Typeclassopedia has a section about monoids, aunque en este caso no estoy seguro de que añade que más allá de la documentation for Data.Monoid.
Por cierto, ¿hay alguna estática sobre cuánto tiempo se tarda hasta que se responde una pregunta sobre Haskell? Tengo la impresión de que el 90% de todas las preguntas de Haskell se responden casi de inmediato. Si bien esto no dice nada sobre la calidad de las respuestas, en mi opinión también tienen una calidad bastante alta. –
@JanChristiansen: Podría responder eso utilizando el explorador de datos de intercambio de pilas si lo desea. Hice una aproximación aproximada (filtre los valores atípicos obvios, ignoro las auto respuestas, etc.), y el tiempo típico (es decir, la mediana) fue de aproximadamente 20 minutos hasta que se publique la primera respuesta. –