Als erster Schritt beobachten wir, dass Ihre Definition
outputList x y = concat . map ($ y) $ map ($ x) [getRow,getColumn,getBlock]
neu geschrieben werden kann, um die Funktion Kompositionsoperator (.)
anstelle der Funktionsanwendung Operator ($)
wie folgt.
outputList x y = (concat . map ($ y) . map ($ x)) [getRow,getColumn,getBlock]
Als nächstes werden wir feststellen, dass map
ein anderer Name für fmap
auf Listen und erfüllt die fmap
Gesetze daher insbesondere, haben wir map (f . g) == map f . map g
. Wir wenden dieses Gesetz an, um eine Version zu definieren, die eine einzige Anwendung von map
verwendet.
outputList x y = (concat . map (($ y) . ($ x))) [getRow,getColumn,getBlock]
Als letzten Schritt können wir die Zusammensetzung von concat
und map
durch concatMap
ersetzen.
outputList x y = concatMap (($ y) . ($ x)) [getRow,getColumn,getBlock]
Schließlich, meiner Meinung nach, obwohl Haskell Programmierer neigen viele Phantasien Betreiber zu verwenden, ist es nicht eine Schande, die Funktion von
outputList x y = concatMap (\f -> f x y) [getRow,getColumn,getBlock]
zu definieren, wie es klar zum Ausdruck bringt, was die Funktion tut. Die Verwendung von Klassenklassen-Abstraktionen (wie in der anderen Antwort gezeigt) kann jedoch eine gute Sache sein, da Sie beobachten können, dass Ihr Problem eine gewisse abstrakte Struktur hat und neue Einsichten gewinnt.
Übrigens, gibt es Statik, wie lange dauert es, bis eine Frage bezüglich Haskell beantwortet wird? Ich habe den Eindruck, dass 90 Prozent aller Haskell-Fragen fast sofort beantwortet werden. Das sagt zwar nichts über die Qualität der Antworten aus, aber sie haben meiner Meinung nach auch eine recht hohe Qualität. –
@ JanChristiansen: Sie könnten das mit dem Stack Exchange Data Explorer beantworten, wenn Sie möchten. Ich habe eine sehr grobe Annäherung gemacht (offensichtliche Ausreißer filtern, Selbstantworten ignorieren, & c.), Und die typische (d. H. Median) Zeit war ungefähr 20 Minuten, bis die erste Antwort gepostet wurde. –