按值交换Haskell中的两个元素

时间:2013-03-20 17:34:37

标签: haskell swap

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

例如:

swap 5 6 [1,5,7,6,4,3,2] -> [1,6,7,5,4,3,2]

56是值而不是索引,值的索引可以是任意值。

2 个答案:

答案 0 :(得分:7)

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

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解决方案(这更具惯用性!)。

答案 1 :(得分:5)

swap a b = map (\x -> if x == a then b else if x == b then a else x)
编辑:啊,恐怕我只是注意到在我发布答案之后,上面的评论中回答了这个问题。道歉。