4

すばらしいサイトから高次関数のページを読んだ後でも、関数合成と組み合わせた否定関数を理解するのに苦労しています。

より具体的には、次のコードを使用します。

ghci> map (negate . sum . tail) [[1..5],[3..6],[1..7]]

これにより、次の結果が得られます。

[-14,-15,-27] 

もう一度ページを読み直しましたが、正直なところ、そのコード行がどのようにしてこの回答を生成したのか、まだわかりません。

4

2 に答える 2

5

AndrewCの優れた答えに別の視点を追加するために、私は通常、ファンクターの法則fmap. mapto リストの特殊化と考えることができるので、より一般的なfmapものに置き換えて、同じ機能を維持できます。mapfmap

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]
于 2013-06-26T21:22:46.760 に答える