按值交换Haskell中的两个元素

按值交换Haskell中的两个元素,haskell,swap,Haskell,Swap,我是哈斯克尔的新手。当我只知道值时,我需要一个函数来交换列表中的两个元素 例如: swap 5 6 [1,5,7,6,4,3,2] -> [1,6,7,5,4,3,2] 5和6是值而不是索引,值的索引可以是任何值 swap a b = map (\x -> if x == a then b else if x == b then a else x) 编辑:啊,恐怕我只是注意到,在我发布答案后,这个问题在上面的评论中得到了完全相同的回答。抱歉。如果您将此任务视为使用交换的值重建列表

我是哈斯克尔的新手。当我只知道值时,我需要一个函数来交换列表中的两个元素

例如:

swap 5 6 [1,5,7,6,4,3,2] -> [1,6,7,5,4,3,2]
5
6
是值而不是索引,值的索引可以是任何值

swap a b = map (\x -> if x == a then b else if x == b then a else x)

编辑:啊,恐怕我只是注意到,在我发布答案后,这个问题在上面的评论中得到了完全相同的回答。抱歉。

如果您将此任务视为使用交换的值重建列表,可能会有所帮助。类型签名是这样的。您将接收两个要交换的数字和一个列表

swap :: Int -> Int -> [Int] -> [Int]
你现在有几个案子。如果列表是空的,那很容易。这是你的基本情况

swap _ _ [] = []
如果列表不是空的,那么您有两个选择。列表的开头要么是你感兴趣的数字,要么不是。在匹配的情况下,交换值,否则只需重建列表

swap n m (x:xs)
  | n == x = m : (swap n m xs)
  | m == x = n : (swap n m xs)
  | otherwise = x : (swap n m xs)

一旦出现这种情况,您可以看到您正在对每个元素进行操作。现在,您可以将其转换为
map
解决方案(这更为惯用!)。

如果有多个元素具有给定的值,或者只有一个值存在,该怎么办
map(\x->if x==a,那么b else if x==b,那么a else x)列表
将为这些问题的特定答案提供解决方案。如果简单,就说没有重复项最简单的是上面的问题。如果您之前有
k
5个和
m
6个,那么之后将有
k
6个和
m
5个。如果你需要考虑列表中任意一个值的多重性,无论以何种方式,它都会变得更复杂。哇,thx daniel对于如此快速的答案,我从来没有想过使用map:)我想我不喜欢haskell,但我必须做我的家务我试过类似的方法,但没有成功,现在我明白了:D