Alt is used most often as boolean OR on fallible [[Functor|functors]], but is technically whatever associative operation makes sense for the [[Data Structures|data]] type. ```haskell class Functor f <= Alt f where alt :: forall a. f a -> f a -> f a ``` ### Examples In [[Maybe]], Alt allows chainable defaults: ```haskell Just 1 <|> Just 2 -- Just 1 Nothing <|> Just 1 -- Just 1 Nothing <|> Nothing -- Nothing Nothing <|> Nothing <|> Just 1 -- Just 1 ``` In [[Either]], Alt works as a try/catch: ```haskell Left "error!" <|> Right "it's ok i recovered" -- Right "it's ok i recovered" Right "i succeeded!" <|> Right "backup" -- Right "i succeeded!" Right unit <|> Left "uh oh!" -- Right unit Left "a" <|> Left "b" -- Left "b" ``` > [!attention] > Note that Alt in Either takes the last `Left` when all are `Left`! In [[Array]], Alt is append: ```haskell [] <|> [] -- [] ["a"] <|> [] -- ["a"] [] <|> ["a"] -- ["a"] ["a"] <|> ["b"] -- ["a", "b"] ["a"] <|> ["b", "c"] -- ["a", "b", "c"] ```