我正在尝试循环包含其他数据类型(包括其自身)的数据类型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;
答案 0 :(得分:2)
这种模式:
SET(hd::tl::[])
表示SET ___
,其中参数是一个列表,其中包含两个元素hd
和tl
。 (它相当于SET [hd, tl]
。)
相反,你打算写:
SET(hd::tl)
表示SET ___
,其中参数是包含至少一个元素的列表hd
; tl
是hd
之后所有元素的列表(如果有的话)。
但你应该真正写的是:
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
希望这有帮助