Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compiler errors 在模式中未使用参数的数据构造函数?_Compiler Errors_Sml_Smlnj - Fatal编程技术网

Compiler errors 在模式中未使用参数的数据构造函数?

Compiler errors 在模式中未使用参数的数据构造函数?,compiler-errors,sml,smlnj,Compiler Errors,Sml,Smlnj,我对SML不太熟悉,但我编写了以下程序: datatype 'a bin_tree = Leaf of 'a | Node of 'a bin_tree * 'a bin_tree fun height Leaf (x) = 0 | height Node (l1,l2) = 1 + Int.max(l1,l2) fun is_balanced Leaf (x) = true | is_balanced Node (l1,l2) = if(abs(height(l1)

我对SML不太熟悉,但我编写了以下程序:

datatype 'a bin_tree = Leaf of 'a
|   Node of 'a bin_tree * 'a bin_tree

fun height Leaf (x) = 0
|   height Node (l1,l2) = 1 + Int.max(l1,l2)

fun is_balanced Leaf (x) = true
|   is_balanced Node (l1,l2) = 
    if(abs(height(l1) - height(l2))<2)
        then (is_balanced(l1); is_balanced(l2))
    else false

val prod_tree = fold_tree
    op* (fn x => x)

fun fold_tree e f Leaf (x) =  f(x)
|   fold_tree e f Node (l1, l2) = (e(fold_tree e f(l1)), e(fold_tree e f(l2)))

我已经做了研究,但也许我遗漏了什么。任何帮助都将不胜感激。谢谢

有很多问题。由于这似乎是家庭作业,我将指出一些事情,但让您了解细节:

1) 在SML中,函数应用程序具有最高的优先级。因此,这条线

fun height Leaf (x) = 0
解析为

fun (height Leaf) x = 0
而不是预期的

fun height (Leaf x) = 0
请注意,
(height Leaf)
将函数
height
应用于构造函数
Leaf
,其中
Leaf
没有参数——因此,在模式中使用的隐式错误消息
数据构造函数Leaf没有参数。在代码的其他地方重复基本相同的错误。所有情况下的解决方案都是在构造函数表达式周围加括号;e、 g.使用
(叶子x)
而不是
叶子(x)

2)
Int.max(l1,l2)
没有意义,因为
l1
l2
是树而不是整数。也许你想测量这些树的高度

3)
不是布尔运算符<代码>并且也是

4) 在定义树之前,您正在尝试使用它。首先定义它


根据这些提示,您应该能够调试代码。几分钟后,我就可以让您的函数正常工作了,所以您就快到了。

有很多问题。由于这似乎是家庭作业,我将指出一些事情,但让您了解细节:

1) 在SML中,函数应用程序具有最高的优先级。因此,这条线

fun height Leaf (x) = 0
解析为

fun (height Leaf) x = 0
而不是预期的

fun height (Leaf x) = 0
请注意,
(height Leaf)
将函数
height
应用于构造函数
Leaf
,其中
Leaf
没有参数——因此,在模式中使用的隐式错误消息
数据构造函数Leaf没有参数。在代码的其他地方重复基本相同的错误。所有情况下的解决方案都是在构造函数表达式周围加括号;e、 g.使用
(叶子x)
而不是
叶子(x)

2)
Int.max(l1,l2)
没有意义,因为
l1
l2
是树而不是整数。也许你想测量这些树的高度

3)
不是布尔运算符<代码>并且也是

4) 在定义树之前,您正在尝试使用它。首先定义它


根据这些提示,您应该能够调试代码。几分钟后,我就可以让您的函数正常工作了,所以您就快到了。

因为
运算符的类型为
'a*'b->'b
,当然它是为布尔型定义的:-P@SimonShine说得好。我猜这是一个布尔投影算子。我应该说它不是一个有用的布尔运算符(尽管我相信你可以想出一个聪明的用例)。测试副作用时:
valtest=(预期失败(…);false)handleexpectedexn…=>真的|=>假的
谢谢你的帮助,我一定会尝试一下这些建议的
运算符的类型为
'a*'b->'b
,当然它是为布尔型定义的:-P@SimonShine说得好。我猜这是一个布尔投影算子。我应该说它不是一个有用的布尔运算符(尽管我相信你可以想出一个聪明的用例)。测试副作用时:
valtest=(预期失败(…);false)handleexpectedexn…=>真的|=>假的
谢谢你的帮助,我一定会尝试一下这些建议