sml list [tycon mismatch]操作数和操作符不同意

时间:2017-02-14 16:33:45

标签: list sml

我正在尝试循环包含其他数据类型(包括其自身)的数据类型SET,并使用循环函数循环打印出这些数据类型。

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;

2 个答案:

答案 0 :(得分:2)

这种模式:

SET(hd::tl::[])

表示SET ___,其中参数是一个列表,其中包含两个元素hdtl。 (它相当于SET [hd, tl]。)

相反,你打算写:

SET(hd::tl)

表示SET ___,其中参数是包含至少一个元素的列表hd; tlhd之后所有元素的列表(如果有的话)。

但你应该真正写的是:

SET xs

表示SET ___,其中参数是任何列表,称为xs。此时您无需解构xs;相反,你的内部loop函数处理解构,并且(更重要的是)还处理列表为空的情况。

答案 1 :(得分: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

希望这有帮助