在ML中展开列表

时间:2010-12-17 09:09:14

标签: sml smlnj

大家好,我正在尝试编写可以从任何深度展开列表中的int的函数,例如,如果我有以下bigList: [12, [34], [11,[1]]]我想要接收

[(1,12),(2,34),(3,11),(4,1)]

元组中的第一个元素是深度,第二个元素是数字 我写了这段代码:

datatype 'a bigList = Empty of unit
   | Element of 'a
   | List of 'a bigList list;


local
fun unfolder( Empty , n ) = []
 | unfolder( (Element l)::ls, n ) = (n, l)::unfolder( ls, n )
 | unfolder( (List l)::ls, n) = unfolder( l, n + 1)::unfolder(ls, n)

in
fun flat list = unfolder(list, 1)  
end;

每次收到以下错误:

Standard ML of New Jersey v110.71 [built: Thu Sep 17 08:50:14 2009]
- datatype 'a bigList = Element of 'a | Empty of unit | List of 'a bigList list
stdIn:9.5-11.69 Error: data constructor Empty used without argument in pattern
stdIn:11.33-11.69 Error: operator and operand don't agree [tycon mismatch]
  operator domain: (int * 'Z) list * (int * 'Z) list list
  operand:         (int * 'Z) list * (int * 'Z) list
  in expression:
    unfolder (l,n + 1) :: unfolder (ls,n)
- 

提前感谢任何帮助

1 个答案:

答案 0 :(得分:2)

  

数据构造函数在模式

中使用不带参数的空

您将Empty定义为Empty of unit,这意味着您需要将其用作Empty (),这是毫无意义的。要仅将其用作Empty,您需要将其定义为Empty,而不是of unit

unfolder (l,n + 1) :: unfolder (ls,n)

::的类型是'a * ['a] -> ['a],这意味着左操作数必须是单个元素,右操作数必须是列表。在上面两个操作数都是一个列表,所以你得到一个类型错误。

要连接两个列表,请使用@运算符,而不是::