2016-09-21 62 views
0

我沒那麼熟悉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))) 

然而,當被編譯use "lab2.sml";我得到以下錯誤:

lab2.sml:4.12-4.16 Error: data constructor Leaf used without argument in pattern 
lab2.sml:5.10-5.14 Error: data constructor Node used without argument in pattern 
lab2.sml:7.17-7.21 Error: data constructor Leaf used without argument in pattern 
lab2.sml:8.15-8.19 Error: data constructor Node used without argument in pattern 
lab2.sml:9.10-9.33 Error: operator and operand don't agree [overload conflict] 

我做我的研究,但也許我只是想念一些東西。任何幫助將不勝感激。謝謝!

回答

3

有很多問題。由於這似乎是功課,所以我會指出幾件事情,但讓你弄清楚細節:

1)在SML中,函數應用程序具有儘可能高的優先級。因此,該線

fun height Leaf (x) = 0 

解析作爲

fun (height Leaf) x = 0 

而不是預期的

fun height (Leaf x) = 0 

注意(height Leaf)具有施加到構造Leaf其中Leaf沒有參數的函數height - 因此神祕的錯誤消息data constructor Leaf used without argument in pattern。您在代碼中的其他地方重複基本相同的錯誤。所有情況下的解決方案都是在構造函數表達式的周圍放置括號。例如使用(Leaf x)而不是Leaf (x)

2)Int.max(l1,l2)是沒有意義的,因爲l1l2是樹而不是整數。可能你打算採取這些樹的高度。

3);不是布爾運算符。 andalso是。

4)在定義之前,您正在嘗試使用fold_tree。先定義它。

鑑於這些提示,您應該可以調試您的代碼。只需幾分鐘,我就可以開始工作,所以你快到了。

+0

由於';'運算符的類型爲''a *'b - >'b',所以它對於布爾值是明確定義的。 :-P –

+0

@SimonShine好點。我想這將是一個布爾投影算子。我應該說它不是一個有用的布爾運算符(儘管我相信你可以提出一個聰明的用例)。 –

+0

排序,是的。當測試副作用時:'val test =(expected_to_fail(...); false)處理ExpectedExn ... => true | _ =>假' –

相關問題