【发布时间】:2017-03-28 20:05:02
【问题描述】:
我有以下两种数据类型:
datatype leaf = Slist of string list | Real of real | nil;
datatype 'a tree = Empty | Node of leaf * 'a tree * 'a tree * 'a tree;
下面的代码遍历所有长度为 1/2 的树,并形成叶子中值的列表。
fun list12(Empty:'a tree) = nil
| list12(Node(leaf leaf1, 'a tree a1, 'a tree a2, 'a tree a3)) =
if (not(a1 = Empty) andalso not(a2 = Empty) andalso not(a3 = Empty))
then list12(a1)::list12(a2)::list12(a3)
else leaf1::list12(a1)::list12(a2)::list12(a3);
问题是,我遇到语法错误,例如
stdIn:94.59-94.66 Error: syntax error: deleting TYVAR ID
stdIn:94.71-94.78 Error: syntax error: deleting TYVAR ID
stdIn:94.83-94.93 Error: syntax error: deleting TYVAR ID ID
stdIn:94.93-94.97 Error: syntax error: deleting RPAREN RPAREN EQUALOP
stdIn:94.98-94.102 Error: syntax error: deleting IF LPAREN
stdIn:94.109-94.116 Error: syntax error: deleting EQUALOP ID
代码本身并不复杂。基本情况是如果它为空,则返回 null。 如果它没有三个节点,那么我添加叶子的值并递归调用节点上的函数。如果是这样,我只是递归调用节点上的函数而不添加叶子。
它可以工作,因为它是空的,它通过将 nil 添加到列表中来结束搜索,这什么都不做。
我也尝试过其他情况比如使用and而不是andalso,以及其他版本的代码比如
| list12(Node(leaf1, Empty, Empty, Empty)) = nil
| list12(Node(leaf2, a1, Empty, Empty)) = leaf2::list12(a1);
| list12(Node(leaf3, b1, b2, Empty)) = leaf3::list12(b1)::list12(b2);
| list12(Node(leaf4, c1, c2, c3)) = list12(c1)::list12(c2)::list12(c3);
但我发现上面的情况并不符合所有情况。
知道为什么会出现语法错误吗?
旁注,为什么1.0 = 2.0 不起作用,但在摘要中它说它适用于真实?它似乎只适用于整数,>、< 等也不起作用。
【问题讨论】: