Or, to keep it a fold,

asum xs = foldr go (fromMaybe empty) xs Nothing where
  go x r Nothing = r (Just x)
  go x r (Just prev) = prev <|> r (Just x)

On Jun 10, 2016 11:09 AM, "Dan Burton" <danburton.email@gmail.com> wrote:
Add a pattern match for the single-element list to stop it from hitting the empty list base case.

asum [] = empty
asum [x] = x
asum (x:xs) = x <|> asum xs


On Friday, June 10, 2016, Tom Ellis <tom-lists-haskell-cafe-2013@jaguarpaw.co.uk> wrote:
On Fri, Jun 10, 2016 at 05:37:41PM +0300, Юрий Сыровецкий (Yuriy Syrovetskiy) wrote:
> It is so because in base library
>
>     asum = foldr (<|>) empty
>
> What if it was defined
>
>     asum [] = empty
>     asum [x:xs] = x <|> asum xs

Those are the same (assuming you mean (x:xs) instead of [x:xs]).

Tom
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe


--
-- Dan Burton

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe