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

SML-未绑定变量或构造函数,sml,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);

我有下一个代码:

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.”(未绑定变量或构造函数)。我如何修复它,使它知道函数“What”


谢谢。

SML中的声明自上而下工作,所以
map
看不到
什么
。切换顺序不会有帮助,因为那样
What
就看不到
map
,会出现同样的错误。相反,您需要同时使用
声明相互递归的函数:

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))

必须使用
进行相互递归。不过,代码中还有一些其他问题
What
显然是一个
expr->number list
,这意味着
map
必须是
expr list->(number list)list
,因此在最后一行中,您试图将
number list list
附加到
number list
中。但是,根本不清楚代码要做什么,因此您可能需要自己制定出预期的逻辑。似乎没有任何明显的方法可以编写具有所需类型的函数。

谢谢Nicholas,我只是处理了这个问题,然后进行堆栈。“b”可以是表达式的列表。我只想检查列表中的每个expr,并确定它是“Number1”还是“Number3”或数据类型expr——所有这些我都是通过函数What来完成的。唯一的想法是使用“映射”来检查列表中的每个成员。但它给出了一个错误:“操作数和运算符不一致”。知道吗?你的类型很混乱。首先,是的:b绝对是一个expr列表。它们都是表达式:b中没有数字1或数字3。你必须向我们解释你想做什么,因为我认为我们没有机会在其他方面帮助你。你是否意识到你的地图功能与普通地图有很大的不同?也许这就是困惑。你也忽略了y;这个表达式是用来做什么的吗?为什么我的函数与法线贴图不同?我将澄清我的问题:第2个是expr,可以是expr列表。现在,如果它是一个expr列表,那么我想检查该列表中的每个成员,并找出它是K还是2。然后,我需要决定如何处理这个成员(它可以是Number1或Number3,我在哪个函数中的前两行),并制作一个只包含Number1或Number3的列表。因此,我直观的方法是使用map函数,使用map检查“b”中的每个成员,取消列表末尾的锁定。非常感谢。