Raising behavior in this case is special casey and limiting.

Exceptions are for exceptional cases. Let's take `max` as an example. Is passing _a list_ to this function that expects _a list_ an exceptional case? It depends. If we choose to limit the scope of `max` to only work on non-empty lists, then the current raising behavior is OK. But that limitation should be reflected in the docs (for `max` and others). I personally don't like this, and the language does not have sufficient tools to describe this limitation in code.

The reason I don't like `max` raising is because it's a limitation. Imagine we have a list of lists and want to map them like this

```
Enum.map list_of_lists, Enum.max(&1)
```

Usually, checking that data is in valid state is responsibility of the user. I.e., if I didn't want `list_of_lists` to have empty lists, I would check it before invoking `map`:

```
list_of_lists
|> Enum.filter(fn x -> not Enum.empty?(x) end)
|> Enum.map(Enum.max(&1))
```

What if I want to keep empty lists in the invocation of `max`?

```
# remember where all the empty lists are
empties = Enum.reduce(list_of_lists, {0, []}, fn(x, {i, acc}) ->
  if x == [] do
    { i+1, [i|acc] }
  else
    { i+1, acc }
  end
end |> Enum.reverse

# map
list_of_lists
|> Enum.filter(fn x -> not Enum.empty?(x) end)
|> Enum.map(Enum.max(&1))

# restore empty lists as nils
list_of_lists = list_of_lists
|> Enum.reduce({ 0, empties, [] }, fn(x, {i, [h|t], acc}) ->
  if i == h do
    { i+1, t, [x, nil | acc] }
  else
    { i+1, [h|t], [x | acc] }
  end
end
|> Enum.reverse
```

Granted, I may not want to have `nil`s in my resulting list. But `nil`s can be mapping to something else. Exceptions _cannot_ be mapped.

---

And I still think this _is_ similar to the `String.contains?` discussion.

```
Enum.all? list_of_strings, String.contains?("abc", &1)
```

If `list_of_strings` contains an empty string, do we force the user to sanitize the list beforehand (like in the code above) or make it work with like today?