You're forgetting to handle the case of a list with a single element.
Also, in the case x :: y :: xs, when x is not equal to y you should return x :: (noDupes y :: xs) to make sure the rest of the list gets deduplicated.
x :: y :: xs
x :: (noDupes y :: xs)
I don't think you need to handle the case x :: xs at all, but you might need to handle the case of a list with two elements.
x :: xs
Now I have some missing possibilities:
This `case` does not have branches for all possibilities:
9|> case list of
10|>  -> 
12|> if x == y then
13|> x :: list
15|> x :: y :: list
16|> x::y::xs ->
17|> if x == y then
18|> x :: noDupes xs
20|> x :: (noDupes (y::xs))
Missing possibilities include:
I would have to crash if I saw one of those. Add branches for them!
Hint: If you want to write the code for each branch later, use `Debug.todo` as a
placeholder. Read <https://elm-lang.org/0.19.0/missing-patterns> for more
guidance on this workflow.
You cases check for 1) an empty list, 2) a list with exactly two elements, and 3) a list with 2 elements and a tail. You forgot to check for the singleton list (a list with exactly one element) which is what the compiler is warning you about. Note, checking for a list with exactly two elements is not effective for this particular program.
I'm taking a note of "checking for a list with exactly two elements is not effective for this particular program."
How do I pattern match on the list with two elements?
noDupes : List a -> List a
noDupes list =
case list of
 -> 
if x == y then
x :: list
x :: y :: list
if x == y then
x :: noDupes xs
x :: (noDupes y::xs)
And in the case of two element how do you add that to the rest of the list? As you can see I use "list" in the second case. I don't think it's correct.
We're a place where coders share, stay up-to-date and grow their careers.
We strive for transparency and don't collect excess data.