は、最初のステップとして、私たちはあなたの定義
outputList x y = concat . map ($ y) $ map ($ x) [getRow,getColumn,getBlock]
は、次のように関数合成演算子(.)
代わりに関数適用演算子の($)
を使用して書き換えることができることを確認します。
outputList x y = (concat . map ($ y) . map ($ x)) [getRow,getColumn,getBlock]
次はmap
したがって、特に、我々はmap (f . g) == map f . map g
を持って、リストを満たすfmap
法律上fmap
のための別の名前であることに気づきます。 map
という単一のアプリケーションを使用して、この法律を適用してバージョンを定義します。
outputList x y = (concat . map (($ y) . ($ x))) [getRow,getColumn,getBlock]
は、最後のステップとして、我々はconcatMap
によってconcat
とmap
の構図を置き換えることができます。Haskellのプログラマは、多くの派手な演算子を使用する傾向があるものの
outputList x y = concatMap (($ y) . ($ x)) [getRow,getColumn,getBlock]
は最後に、私の意見では、明らかに機能が何をするか、表現として
outputList x y = concatMap (\f -> f x y) [getRow,getColumn,getBlock]
で関数を定義するための恥ではありません。しかし、(他の答えに示されているように)型クラス抽象化を使用することは、問題が特定の抽象的な構造を持ち、新しい洞察を得ることができるので、良いことです。
ところで、ハスケルに関する質問に答えるまでどのくらい時間がかかるのですか?私は、ハスケルのすべての質問の90%がほぼ即座に答えられるという印象を受けています。これは答えの質については何も言いませんが、私の意見では彼らもかなり高い品質を持っています。 –
@JanChristiansen:もしあなたが望むなら、スタック交換データエクスプローラを使ってそれに答えることができます。私は非常におおよその近似を行い(明らかな異常値をフィルタリングし、自己解答を無視する)、典型的な(すなわち中央値の)時間は、最初の回答が投稿されるまで約20分であった。 –