すばらしいサイトから高次関数のページを読んだ後でも、関数合成と組み合わせた否定関数を理解するのに苦労しています。
より具体的には、次のコードを使用します。
ghci> map (negate . sum . tail) [[1..5],[3..6],[1..7]]
これにより、次の結果が得られます。
[-14,-15,-27]
もう一度ページを読み直しましたが、正直なところ、そのコード行がどのようにしてこの回答を生成したのか、まだわかりません。
すばらしいサイトから高次関数のページを読んだ後でも、関数合成と組み合わせた否定関数を理解するのに苦労しています。
より具体的には、次のコードを使用します。
ghci> map (negate . sum . tail) [[1..5],[3..6],[1..7]]
これにより、次の結果が得られます。
[-14,-15,-27]
もう一度ページを読み直しましたが、正直なところ、そのコード行がどのようにしてこの回答を生成したのか、まだわかりません。
AndrewCの優れた答えに別の視点を追加するために、私は通常、ファンクターの法則とfmap
. map
to リストの特殊化と考えることができるので、より一般的なfmap
ものに置き換えて、同じ機能を維持できます。map
fmap
ghci> fmap (negate . sum . tail) [[1..5],[3..6],[1..7]]
これで、代数置換を使用して合成ファンクターの法則を適用して、合成が行われている場所をシフトし、各関数をリスト上で個別にマッピングできます。
fmap (f . g) == fmap f . fmap g -- Composition functor law
fmap (negate . sum . tail) $ [[1..5],[3..6],[1..7]]
== fmap negate . fmap (sum . tail) $ [[1..5],[3..6],[1..7]]
== fmap negate . fmap sum . fmap tail $ [[1..5],[3..6],[1..7]]
== fmap negate . fmap sum $ fmap tail [[1..5],[3..6],[1..7]]
== fmap negate . fmap sum $ [tail [1..5],tail [3..6],tail [1..7]] -- As per AndrewC's explanation
== fmap negate . fmap sum $ [[2..5],[4..6],[2..7]]
== fmap negate $ [14, 15, 27]
== [-14, -15, -27]