我是 Haskell 的新手。当我只知道值时,我需要一个函数来交换列表中的两个元素。
例如:
swap 5 6 [1,5,7,6,4,3,2] -> [1,6,7,5,4,3,2]
5
并且6
这些值不是索引,并且值的索引可以是任何值。
如果您将此任务视为使用交换的值重建列表,这可能会有所帮助。类型签名将是这样的。您正在输入两个要交换的数字和一个列表。
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
解决方案(这更加惯用!)。
swap a b = map (\x -> if x == a then b else if x == b then a else x)
编辑:啊,恐怕我只注意到在我发布答案后,上面的评论以完全相同的方式回答了这个问题。道歉。