SML - 未绑定的变量或构造函数

时间:2011-11-04 13:25:40

标签: sml

我有下一个代码:

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”功能。(未绑定的变量或构造函数)。我该如何解决它,它会知道“什么”这个功能?

感谢。

2 个答案:

答案 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}}。虽然代码本来要做的事情一点也不清楚,所以你可能需要自己计算出你想要的逻辑。看起来没有任何明显的方法来编写具有所需类型的函数。