List 如何在Haskell中切换列表中的2个元素

List 如何在Haskell中切换列表中的2个元素,list,haskell,List,Haskell,我将从一个例子开始(我认为它将确切地说明我的问题) 其中[[1,2,3,4],[5,6,0,7]!!1.2是零元素。第一个整数始终为1,第二个整数的范围在0和3之间,我希望通过索引(来自第二个组件列表)更改作为参数提供的元素,该元素位于第一个组件列表中的相同位置 我知道列表在Haskell中是不可变的,但是我仍然无法理解 我怎样才能做到这一点?开关I j l=[a,b] switch i j l = [a,b] where (a,b) = unzip [if j==n then (l!!

我将从一个例子开始(我认为它将确切地说明我的问题)

其中[[1,2,3,4],[5,6,0,7]!!1.2是零元素。第一个整数始终为1,第二个整数的范围在0和3之间,我希望通过索引(来自第二个组件列表)更改作为参数提供的元素,该元素位于第一个组件列表中的相同位置

我知道列表在Haskell中是不可变的,但是我仍然无法理解

我怎样才能做到这一点?

开关I j l=[a,b]
switch i j l = [a,b]
    where (a,b) = unzip [if j==n then (l!!1!!n, l!!0!!n) else (l!!0!!n,l!!1!!n) | n<-[0..3]] 

其中(a,b)=解压[如果j==n,那么(l!!1!!n,l!!0!!n)其他(l!!0!!n,l!!1!!n)|列表是不可变的,对吧。但是你可以从其他列表构造新的列表。另外,如果第一个整数总是1,为什么要传递它?在你的示例中,它看起来毫无意义。你可以从定义函数
switch::Int->[Int]->[Int]->[Int]-[Int]([Int],[Int])开始)
这样您就不会弄乱这个函数中的子列表扩展。@d12frosted我可以双向切换元素,但我给出了这个示例,希望得到一个解释,一旦我理解了它是如何完成的,我想我可以很容易地调整函数,使它在两种方式下都能正常工作
switch i j l = [a,b]
    where (a,b) = unzip [if j==n then (l!!1!!n, l!!0!!n) else (l!!0!!n,l!!1!!n) | n<-[0..3]] 
switch _ n [xs,ys] = [xs',ys']
   where (xs',ys',_) = unzip3 $ 
                       map (\t@(x,y,m) -> if m==n then (y,x,m) else t) $
                       zip3 xs ys [0..]