我是Haskell的新手.当我只知道值时,我需要一个函数来交换列表中的两个元素.
例如:
swap 5 6 [1,5,7,6,4,3,2] -> [1,6,7,5,4,3,2]
Run Code Online (Sandbox Code Playgroud)
5并且6值不是索引,值的索引可以是任意值.
如果您将此任务视为使用交换的值重建列表,则可能会有所帮助.类型签名将是这样的.你需要交换两个数字和一个列表.
swap :: Int -> Int -> [Int] -> [Int]
Run Code Online (Sandbox Code Playgroud)
你现在有几个案子.如果列表为空,那很容易.这是你的基本情况.
swap _ _ [] = []
Run Code Online (Sandbox Code Playgroud)
如果列表不为空,那么您有两个选择.列表的头部是您感兴趣的数字,或者不是.在匹配的情况下,交换值,否则只重建列表.
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)
Run Code Online (Sandbox Code Playgroud)
一旦你遇到这种情况,你就可以看到你正在对每个元素进行操作.现在您可以将其转换为map解决方案(这更具惯用性!).
swap a b = map (\x -> if x == a then b else if x == b then a else x)
Run Code Online (Sandbox Code Playgroud)
编辑:啊,我害怕我只是注意到在我发布我的答案之后,上面的评论中以完全相同的方式回答了这个问题.道歉.
| 归档时间: |
|
| 查看次数: |
3465 次 |
| 最近记录: |