Ink

Contents related to tech, hobby, etc

foldl1/foldr1のワナ -- Foldableが空だと死ぬ

|

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