首页 文章

简单函数返回整数列表

提问于
浏览
0

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

fun listofnodes((x:int,y:int):: xs)= if xs = nil then [x :: y] else [[x :: y] @listofnodes(xs)]

stdIn:15.12-15.18错误:运算符和操作数不一致[tycon mismatch operator domain:int * int list operand:int * int in expression:x :: y .

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

1 回答

  • 1

    首先,您应该知道每个运算符的作用:::将各个元素放入现有列表中,以便: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)列表 - >'列表',这意味着它适用于所有输入类型,包括int(只要元组不包含冲突类型,如char和一个int) . 我猜你知道这一点,但万一你没有:你所谓的对,(1,2),被称为元组 .

相关问题