電子書籍の厳選無料作品が豊富!

Haskellのsubtractについて

最近Haskellを自習し始めました。以下の関数の意味が分かりません。

map (`subtract` 5) [1..5]の結果、[4,3,2,1,0]
map (5 `subtract`) [1..5]の結果、[-4,-3,-2,-1,0]

ここは、前置と中置の違いがあるので理解できます。

map (subtract 5) [1..5]の結果が[-4,-3,-2,-1,0]になる訳と
map ((-) 5) [1..5]の結果が[4,3,2,1,0]になる訳が分かりません。

どなたか、分かりやすく教えてください。

A 回答 (1件)

分かりやすくも何もなくって


subtractはそういう定義になっているというだけです.

英語の語順です.つまり
subtract a from b なので,
subtract a b = b - a です.
Haskellらしく書けば
subtract = flip (-)
flip f x y = f y x

だから,
map (`subtract` 5) [1..5]は
[subtract 1 5, sutract 2 5, subtract 3 5, subtract 4 5,subtract 5 5]
=
[5-1,5-2,5-3,5-4,5-5]
=[4,3,2,1,0]

map (5 `subtract`) [1..5]
についても同様.

map ((-) 5) [1..5] = [4.3.2.1,0]
map (\x->5-x) [1..5] = [4,3,2,1,0]
map (\x->x-5) [1..5] = [-4,-3,-2,-1,0]
のようにするほうが少なくとも日本人にとっては
見やすいでしょう.
これくらいなら,無名関数を使うほうが見やすいと思うけど
何度も使うなら関数定義したほうがいいですね
    • good
    • 0
この回答へのお礼

向井淳さんの「入門Haskell」とWebで勉強を始めましたが、手続き型ばかり
やってきたので、なかなか理解できないことが多いのです。
map (5 -) [1..5]なんて書き方もできるし、kabaokabaさんのように、すっと
無名関数とかを使えるように努力します。
早速の回答ありがとうございます。

お礼日時:2010/04/05 22:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!