Stephen Tetley wrote: >> Does it have an obvious default implementation, bearing in mind it we >> might really want a total function? >> >> sconcat [] = error "Yikes - I wish this was total!" >> sconcat [a] = a >> sconcat (a:as) = a <> sconcat as
Holger Siegel wrote: > You have to provide the "neutral" element by yourself: > a <>> [] = a > a <>> (b:bs) = a <> b <>> bs Yes, I think that would be the best interface. At first glance, one would be tempted to do something like returning a Maybe, as is often done in these kinds of cases. But here, the whole point of Semigroup is that we don't know what to do when the list is empty, so getting a Nothing result in that case is unhelpful. To illustrate the point, let's look at the conversion between those two approaches: sconcatNonempty x xs = fromJust . sconcat $ x : xs sconcatMaybe (x:xs) = Just $ sconcat x xs sconcatMaybe _ = Nothing I would much rather write sconcatMaybe when needed than to have to write unsafe code like sconcatNonempty. Presumably it's actually safe, since you would expect implementations to provide a result whenever the list is non-empty. But the type no longer provides that guarantee. Thanks, Yitz _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe