- ベストアンサー
Haskellのsubtractについて
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]になる訳が分かりません。 どなたか、分かりやすく教えてください。
- みんなの回答 (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] のようにするほうが少なくとも日本人にとっては 見やすいでしょう. これくらいなら,無名関数を使うほうが見やすいと思うけど 何度も使うなら関数定義したほうがいいですね
お礼
向井淳さんの「入門Haskell」とWebで勉強を始めましたが、手続き型ばかり やってきたので、なかなか理解できないことが多いのです。 map (5 -) [1..5]なんて書き方もできるし、kabaokabaさんのように、すっと 無名関数とかを使えるように努力します。 早速の回答ありがとうございます。