【问题标题】:SML - unbound variable or constructorSML - 未绑定的变量或构造函数
【发布时间】:2011-11-04 21:52:08
【问题描述】:

我有下一个代码:

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

谢谢。

【问题讨论】:

    标签: sml


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 谢谢 Nicholas,我只是处理这个问题,然后我就开始筹码了。 "b" 可以是 expr 的列表。我只想检查该列表中的每个 expr 并确定它是“Number1”还是“Number3”或数据类型 expr——所有这些都是我通过函数 What 完成的。唯一的想法是使用“地图”来检查列表中的每个成员。但它给出了一个错误:“操作数和运算符不同意”。有什么想法吗?
      • 你的类型很混乱。首先,是的:b 绝对是 expr 的列表。它们都是 exprs:b 中没有 Number1 或 Number3s。你必须向我们解释你想要做什么,因为我认为我们没有机会帮助你。您是否意识到您的贴图功能与法线贴图有很大不同?也许这就是混乱。您也忽略了 y;那个 expr 是用来做某事的吗?
      • 为什么我的功能与法线贴图不同?我将澄清我的问题:数字 2 是 expr,并且可以是 expr 的列表。现在,如果它是一个 expr 列表,那么我想检查该列表中的每个成员,并找出它是 K 还是 Number2。然后,我需要决定如何处理这个成员(它可以是 Number1 或 Number3,我在 What 函数中的前两行),并制作一个仅包含 Number1 或 Number3 的列表。所以,我直观的方法是使用地图检查“b”中的每个成员,直到列表的末尾,通过使用地图功能。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      • 2015-02-04
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-17
      相关资源
      最近更新 更多