Other Elixir solutions.
defmodule ListOps do
@spec count(list) :: non_neg_integer
def count([]), do: 0
def count([_ | tail]), do: 1 + count(tail)
@spec reverse(list) :: list
def reverse([], acc), do: acc
def reverse([head | tail], acc), do: reverse(tail, [head | acc])
def reverse(l), do: reverse(l, [])
@spec map(list, (any -> any)) :: list
def map([], _), do: []
def map([head | tail], f), do: [f.(head) | map(tail, f)]
@spec filter(list, (any -> as_boolean(term))) :: list
def filter(l, f), do: for(x <- l, f.(x), do: x)
@type acc :: any
@spec reduce(list, acc, (any, acc -> acc)) :: acc
def reduce([], acc, _), do: acc
def reduce([head | tail], acc, f), do: f.(head, reduce(tail, acc, f))
@spec append(list, list) :: list
def append([], b), do: b
def append([head | tail], b), do: [head | append(tail, b)]
@spec concat([[any]]) :: [any]
def concat([head | tail]), do: append(head, concat(tail))
def concat([]), do: []
end