foldl1/foldr1のワナ -- Foldableが空だと死ぬ
当たり前といえば当たり前だけど、気付くのに数十分くらいはかかってしまったのでメモ
foldl1 / foldr1 はそれぞれ foldl / foldr の亜種で、後者が初期Accumlatorを
指定した後に対象の Foldable を渡す必要がある一方、 1 が付いているシリーズは
対象の Foldable から初期Accumlatorを取得する。
foldl1 :: Foldable t => (a -> a -> a) -> t a -> a
foldr1 :: Foldable t => (a -> a -> a) -> t a -> a
foldl :: Foldable t => (a -> a -> a) -> a -> t a -> a
foldr :: Foldable t => (a -> a -> a) -> a -> t a -> a
で、 1 シリーズを使用するのであれば 対象の Foldable が空にならないように確認する 必要がある。
もし空であった場合、 Prelude.foldr1 であれば
> Prelude.foldr1 const []
*** Exception: Prelude.foldr1: empty list
というエラーが出る。
ちなみに vector パッケージの Data.Vector.foldr1 も同じような問題がある。
その場合のエラーメッセージはこんな感じ
brick3D: ./Data/Vector/Fusion/Stream/Monadic.hs:929 (foldl1M): empty stream
CallStack (from HasCallStack):
error, called at ./Data/Vector/Internal/Check.hs:87:5 in vector-0.12.3.0-DdzviVbdPFECkUuJzBxnHY:Data.Vector.Internal.Check