Compiler errors 在模式中未使用参数的数据构造函数?
我对SML不太熟悉,但我编写了以下程序: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)
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…=>真的|=>假的
谢谢你的帮助,我一定会尝试一下这些建议