简单函数返回整数列表

时间:2012-09-20 23:11:40

标签: smlnj

如果我试图写一个简单的函数,整数对列表 - 表示一个图并返回一个整数列表:图中的所有节点 例如,如果输入是[(1,2)(3,4)(5,6)(1,5)] o / p应为[1,2,3,4,5,6,1,5] 该函数只是返回节点列表,在返回列表中的值可以重复如上所述。 我写了以下函数

有趣的listofnodes((x:int,y:int):: xs)=如果xs = nil则[x :: y] else [[x :: y] @listofnodes(xs)]

stdIn:15.12-15.18错误:运算符和操作数不一致[tycon不匹配   operator domain:int * int list   operand:int * int   表达式:     x :: y。

我无法弄清楚出了什么问题。

1 个答案:

答案 0 :(得分:1)

首先,你应该知道每个运营商的作用: ::将单个elemtents放入现有列表中,以便:1 :: 2 :: 3 :: [] = [1,2,3] @将两个列表放在一起,以便:[1,2] @ [3,4] = [1,2,3,4]

您也可以使用::将列表放在一起,但它会变成列表列表,如: [1,2] :: [3,4] = [[1,2],[3,4]]

所以通过写[x :: y],你说x和y应该成为列表中的列表。

并且您不应该使用if语句来检查列表的结尾,而是可以使用模式来执行此操作:

fun listofnodes [] = []
  | listofnodes ((x,y)::xs) = x :: y :: listofnodes(xs);

第一个模式确保当我们到达列表的末尾时,当你提取最终元组时,你的xs被绑定到一个它自己调用的空列表,它会留下一个空列表来放入所有元素,所以[(1,2)(3,4)(5,6)(1,5)]会像这样评价:

1 :: 2 :: 3 :: 4 :: 5 :: 6 :: 1 :: 5 :: [] = [1,2,3,4,5,6,1,5]。

你也可以这样做:

fun listofnodes [] = []
  | listofnodes ((x,y)::xs) = [x,y] @ listofnodes(xs);

这样,您可以从每个元组中创建一个小的2元素列表,然后将所有这些小列表合并为一个大列表。你真的不需要最后的空列表,但它是确保递归停止在列表末尾的唯一方法,你必须在等号的另一侧放置一些东西。它评估如下:

[1,2] @ [3,4] @ [5,6] @ [1,5] @ [] = [1,2,3,4,5,6,1,5]。

你也将你的x和y视为整数,但你真的不必这样做。如果你不这样做,它会得到类型“('a *'a)列表 - >'列表',这意味着它适用于包括整数在内的所有输入类型(只要元组不包含冲突类型,如char和一个int)。 我猜你知道这一点,但万一你没有:你所谓的对,(1,2),被称为元组。