最初のステップとして、私たちはあなたの定義を観察します
outputList x y = concat . map ($ y) $ map ($ x) [getRow,getColumn,getBlock]
(.)
は、関数適用演算子の代わりに関数合成演算子を使用して($)
次のように書き換えることができます。
outputList x y = (concat . map ($ y) . map ($ x)) [getRow,getColumn,getBlock]
次に、 はon リストmap
の別の名前であり、法則を満たしていることに気付きます。したがって、特に、 があります。この法則を適用して、 の 1 つのアプリケーションを使用してバージョンを定義します。fmap
fmap
map (f . g) == map f . map g
map
outputList x y = (concat . map (($ y) . ($ x))) [getRow,getColumn,getBlock]
concat
最後のステップとして、との構成をmap
で置き換えることができconcatMap
ます。
outputList x y = concatMap (($ y) . ($ x)) [getRow,getColumn,getBlock]
最後に、私の意見では、Haskell プログラマーは多くの派手な演算子を使用する傾向がありますが、関数を次のように定義することは恥ずべきことではありません。
outputList x y = concatMap (\f -> f x y) [getRow,getColumn,getBlock]
それが明確に表現しているように、関数が何をするか。ただし、型クラスの抽象化 (他の回答で示されているように) を使用することは、問題に特定の抽象構造があり、新しい洞察を得ることができるため、良いことです。