A better solution is length-encoded lists (often called Vectors):
data Vector length a where
Empty :: Vector 0 a
Cons :: a -> Vector n a -> Vector (1 + n) a
But Haskell isn't very good at such encodings. Type-level computation is often not worth it.That said, even NonEmptyList is sometimes useful. For example, some Prelude functions could use it:
group :: [a] -> [NonEmptyList a]
Making common idioms like: map head . group ...
Safe again.Not sure what you mean by:
> How could you get the last element from your NonEmptyList? How could you tell how many elements in it?) Exactly two.
import Data.Monoid
import Data.Maybe
lastNel :: NonEmptyList a -> a
lastNel (NEL x xs) = fromMaybe x . getLast $ mconcat $ map (Last . Just) xs
lengthNel :: NonEmptyList a -> Int
lengthNel (NEL x xs) = 1 + length xs