2017-02-14 40 views
-1

我試圖通過一個數據類型,SET,包含其他數據類型,包括本身,並打印出使用循環函數,循環這些數據類型。sml列表[tycon不匹配]操作數和運算符不同意

fun printEXP(SET(hd::tl::[])) = 
    let  
    fun loop (hd::tl) = printEXP(hd):: loop tl | loop [] = []; 
    in() end; 
... 

我得到tycon不匹配錯誤,我不知道如何解決它。我在循環函數中做了什麼錯誤?

operator domain: EXP list 
operand: EXP 

其中

datatype EXP = SET of EXP list; 
+0

您的錯誤在第3行,更具體地說是'printEXP(hd)'。這是因爲'hd'的類型是EXP,你的函數需要一個'EXP list'。 – rshah

回答

0

與功能的問題是,printEXP需要一個EXP list參數,而您的hd提供一個EXP類型。

爲了解決這個問題,你必須在你的EXP類型中有其他的東西。因此,您應該在打印功能中探索其他類型。其次,你的函數會拋出一個非窮舉或者匹配冗餘的錯誤,因爲你只檢查列表是否包含頭部和尾部。看看提供的示例。

例如:

datatype EXP = INT of int | SET of EXP list; 

fun printEXP (INT i) = print (Int.toString i) 
    | printEXP (SET (hd::tl)) = do main set things 
    | printEXP (SET []) = do empty set things 

希望這有助於

+0

-1,對不起。這個函數需要一個'EXP'參數。 (注意,'SET'是一個類型爲'EXP list - > EXP'的構造函數)。問題實際上是用'loop tl',因爲'tl'的類型是'EXP'(而不是'EXP list'類型)如預期)。 – ruakh

+0

@ruakh,但問題始於'hd',是'tl'也會產生問題,這就是我建議函數正確地通過我的答案中的EXP列表的地方。 – rshah

+0

我不明白你爲什麼認爲'hd'有問題。OP的錯誤信息與您所描述的完全相反。 – ruakh

2

這種模式:

SET(hd::tl::[]) 

SET ___其中參數爲與正好兩個元素,hdtl列表。 (這相當於SET [hd, tl]

相反,你的意思是寫:

SET(hd::tl) 

意思是SET ___輻角爲至少一個元素,hd列表;然後tlhd(如果有的話)之後的所有元素的列表。

但是你應該真的寫是什麼:

SET xs 

意思是SET ___,其中參數是任意名單可言,所謂的xs。您目前不需要解構xs;相反,你內在的loop函數處理解構,並且(更重要的是)也處理列表爲空的情況。

相關問題