map' :: (a -> b) -> [a] -> [b]
map' f xs = foldr (\x acc -> f x : acc) [] xs
-- acc
-- []
-- [6]
-- [5,6]
-- [4,5,6]
wrongMap' :: (a -> b) -> [a] -> [b]
wrongMap' f xs = foldl (\acc x -> f x : acc) [] xs
-- acc
-- []
-- [4]
-- [5,4]
-- [6,5,4]
main = do
putStrLn $ show $ map' (+3) [1..3]
putStrLn $ show $ wrongMap' (+3) [1..3]
cf) accumulator
アキュムレータ(英: Accumulator)は、コンピュータにおいて、演算装置による演算結果を累積する、すなわち総和を得るといったような計算に使うレジスタや変数のことである。
Prelude> foldr1 (&&) (repeat False)
False
Prelude> foldr1 (&&) (repeat True)
^CInterrupted.
Prelude> foldl1 (&&) (repeat False)
^C^C^C^C^CInterrupted.
foldr1 (&&) (repeat False)
-> (&&) False ((&&) False ((&&) False ....
foldr1 (&&) (repeat True)
-> (&&) True ((&&) True ((&&) True ...
foldl1 (&&) $ repeat False
-> (&&) ((&&) ((&&) ....
Prelude> :t (.)
(.) :: (b -> c) -> (a -> b) -> a -> c
Prelude> :t ($)
($) :: (a -> b) -> a -> b
cf) 中置関数
Prelude> :t (+)
(+) :: Num a => a -> a -> a
Prelude> (+) 3 4
7
Prelude> 3 + 4
7
Prelude> sum (replicate 5 (max 6.7 8.9))
44.5
Prelude> (sum . replicate 5) (max 6.7 8.9)
44.5
Prelude> sum . replicate 5 $ max 6.7 8.9
44.5
Prelude> sum $ replicate 5 $ max 6.7 8.9
44.5
独り言)
なぜ上から2番目が大丈夫かわからない。
(sum . (replicate 5)) (max 6.7 8.9) ってやらないとダメな気がする。
コンパイラがsumとreplicateの型をみてよろしくやってるの?
独り言 その2)
赤津先生に教えていただけました。
関数合成より関数適用の方が優先度が高いようです。
f . g xs は f . (g xs)と同値。
関数合成を優先したい場合は(f . g) xsとする。
cf) 合成関数の話
https://www.shinko-keirin.co.jp/keirinkan/kosu/mathematics/jissen/jissen59.html