Reputation: 35
Keep in mind, this is part of a homework assignment - so please, no direct answer. I just need some help in finding out the answer, so a link to a tutorial to help me understand the material would be great.
SML code:
datatype 'ingredient pizza =
Bottom
| Topping of ('ingredient * ('ingredient pizza));
datatype fish =
Anchovy
| Shark
| Tuna;
(* Testing Pizza Objects *)
val my_pizza1 = Topping(Tuna, Topping(Shark, Topping(Anchovy, Bottom)));
val my_pizza2 = Topping(Shark, Topping(Tuna, Topping(Anchovy, Bottom)));
val my_pizza3 = Topping(Anchovy, Topping(Shark, Topping(Tuna, Bottom)));
(* My Function Start *)
fun rem_ingredient Bottom = Bottom
| rem_ingredient(t) = fn(Topping(p)) => Topping(t, rem_ingredient(p))
| rem_ingredient(Topping(t,p)) = Topping(t, rem_ingredient(p));
(* My Function End *)
If I call the function rem_ingredient with 1 parameter
val rem_tuna = rem_ingredient Tuna;"
I should get a function that can then call
rem_tuna my_pizza3;
to remove Tuna from pizza3
If I call the same function with 2 parameters
rem_ingredient Tuna my_pizza2;
I should directly remove Tuna from the pizza2 object with the 2 parameters.
The Problem:
I keep getting the error: syntax error: replacing EQUALOP with DARROW on the 3rd constructor of rem_ingredient, I know I'm missing something that is probably obvious. We just start learning SML last week in Programming Languages and I'm still trying to understand it. Anyone pointing me in direction would be appreciated.
Again, no direct answer please, I want to learn the material, but I'm not sure what I'm trying to fix.
Upvotes: 1
Views: 130
Reputation: 36118
To get rid of the syntax error you need to put parentheses around the fn
expression (since the following | pattern
is otherwise taken to be part of the fn
).
However, that is not your real problem here. The function as written does not have a consistent type, because the second case returns a function while the others do not.
Upvotes: 2