This is part of a homework assignment so my goal is to understand **why** this is wrong. As I mentioned before I'm using Moscow ML.

```
fun filter pred = let
 fun f ([], a) = []
 | f ([], a) = a
 |   f (e::L, a) = if pred e then (f L (e::a) ) else (f L a)

in
 f
end

```

The error I get is:

```
| f (e::L, a) = if pred e then (f L (e::a) ) else (f L a)
                                  ^
Type clash: expression of type 
'a list cannot have type
'a list * 'b list

```

I have been reading up on documentation, and it really hasn't helped. What I really don't get is where 'b list is coming from. In our assignment we have to use an accumulator with tail recursion. I believe where my error is is how filter calls the function f. Filter takes the predicate as an argument and f should take the list and accumulator which is initially the empty list.

I've tried calling f like: f L [], But in other examples we didn't actually have to call f with its argument and it was somehow passed automatically. 

Anyway, any help understanding where my mistake is and guidance on how to fix the problem would be greatly appreciated. 

-aitee

(also if anyone could give me any tips on decoding the type expression errors that could also be very beneficial.)