如何使用sml更改列表中的项目?

如何使用sml更改列表中的项目?,sml,ml,Sml,Ml,我有一个元组列表,我想有一个函数,随机选择列表中的两个元组,然后交换这两个元组 例如,如果我有一个列表为0,0,1,0,1,1,1,2,2,0,2,那么,随机选择两个元组。如果选择了0,0和1,0,则此函数的返回结果将是1,0,0,1,1,1,2,2,0,2 我是SML的新手,我正在努力。有一个psudo代码,我想它不对,任何人都可以帮我找到正确的代码吗 fun permutation(lst:(int*int) list)= let val nextInt = Random.r

我有一个元组列表,我想有一个函数,随机选择列表中的两个元组,然后交换这两个元组

例如,如果我有一个列表为0,0,1,0,1,1,1,2,2,0,2,那么,随机选择两个元组。如果选择了0,0和1,0,则此函数的返回结果将是1,0,0,1,1,1,2,2,0,2

我是SML的新手,我正在努力。有一个psudo代码,我想它不对,任何人都可以帮我找到正确的代码吗

  fun permutation(lst:(int*int) list)=
  let
    val nextInt = Random.randRange (1,List.length(lst))
    val r = Random.rand (1,1)
    val x1 = nextInt r
    val x2 = nextInt r
    val temp = sub(lst,r1)
    update(lst,r1,sub(lst,r2))
    update(lst,r2,temp)
  in
    lst
  end

您可以做的一件简单的事情是创建一个helper函数,它接受两个索引和一个列表,并在这些索引处返回两个元组。差不多

fun get_two (i1, i2, xs) =
  let
    fun aux (_, _, [], _, val1, val2) = (val1, val2)
      | aux (i1, i2, x::xs, current_index, val1, val2) =
          if i1 = current_index
          then aux (i1, i2, xs, current_index + 1, SOME x, val2)
          else if i2 = current_index
          then aux (i1, i2, xs, current_index + 1, val1, SOME x)
          else aux (i1, i2, xs, current_index + 1, val1, val2)
  in
    aux (i1, i2, xs, 0, NONE, NONE)
  end
然后编写另一个函数,该函数接受一个列表,使用这个get_two helper函数查找两个值及其在列表中的位置,并生成一个与输入列表相同的新列表,除了切换这两个值之外