我有下一个代码:
datatype expr = K of string| Number2 of expr * (expr list);
datatype number = Number1 of string | Number3 of int;
fun append (nil, l2) = l2
| append (x::xs, l2) = x::append(xs, l2);
fun map [] = []
| map (h::t) = (What h)::(map t);
fun What (K x) = [Number1(x)]
|What (Number2 (t,[])) = Number3(0)::What(t)
|What (Number2 (y,a::b)) = append(What(a), map(b));
它无法识别“What”功能。(未绑定的变量或构造函数)。我该如何解决它,它会知道“什么”这个功能?
感谢。
答案 0 :(得分:8)
SML中的声明从上到下工作,因此map
看不到What
。切换订单无济于事,因为What
不会看到map
,会出现同样的错误。相反,您需要使用and
:
fun map [] = []
| map (h::t) = (What h)::(map t)
and What (K x) = [Number1(x)]
| What (Number2 (t,[])) = Number3(0)::What(t)
| What (Number2 (y,a::b)) = append(What(a), map(b))
答案 1 :(得分:3)
您必须使用and
进行相互递归。您的代码中还有其他一些问题。 What
显然是expr -> number list
,这意味着map
必须是expr list -> (number list) list
,所以在最后一行中,您尝试将number list list
附加到number list
1}}。虽然代码本来要做的事情一点也不清楚,所以你可能需要自己计算出你想要的逻辑。看起来没有任何明显的方法来编写具有所需类型的函数。