2026-09-20
LambdaMap.hs
main :: IO ()
main = do
print (map (\x -> x * x) [1, 2, 3 :: Int])
print (map (+ 3) [1, 2, 3 :: Int])
print (zipWith (\a b -> a * b + 1) [1, 2, 3] [4, 5, 6 :: Int])
\x -> x * xは無名関数(ラムダ式)、(+ 3)は演算子セクションという、どちらも「名前を付けずに関数を作る」書き方です。mainは何を出力するでしょうか?(3行)
Answer
[1,4,9]、[4,5,6]、[5,11,19] — 1行ずつ。mapやzipWithは「関数を引数に取る関数」、つまり高階関数で、その関数を毎回letで名前を付けてから渡す必要はありません。1行目の\x -> x * xは無名関数そのもので、リストの各要素を2乗します。2行目の(+ 3)は演算子セクションと呼ばれる書き方で、\x -> x + 3と全く同じ意味の無名関数を、演算子の片側だけを埋めることで簡潔に表しています。3行目のzipWithは2つのリストを同じ位置同士で無名関数に渡す高階関数で、\a b -> a * b + 1という2引数のラムダ式を使うと、1*4+1=5、2*5+1=11、3*6+1=19という要素ごとの計算になります。無名関数・セクションのどちらも、その場限りでしか使わない小さな関数にわざわざ名前を付ける手間を省くための書き方です。