List 在Haskell中交换给定列表中的相邻输入字符

List 在Haskell中交换给定列表中的相邻输入字符,list,haskell,swap,List,Haskell,Swap,鉴于swapIfAdjacent函数的声明,我需要执行以下操作: swapIfAdjacent :: Eq a => a -> a -> [a] -> [a] 如果a、b或b、a是连续的项目,那么对于第一次也是唯一一次出现,这两个项目的顺序应该互换 到目前为止,我的代码是: swapIfAdjacent _ _ [] = [] swapIfAdjacent a b (x:xs) | a `elem` xs && b `elem` xs

鉴于swapIfAdjacent函数的声明,我需要执行以下操作:

swapIfAdjacent :: Eq a => a -> a -> [a] -> [a]
如果a、b或b、a是连续的项目,那么对于第一次也是唯一一次出现,这两个项目的顺序应该互换

到目前为止,我的代码是:

swapIfAdjacent _ _ [] = []
swapIfAdjacent a b (x:xs) | a `elem` xs && b `elem` xs
                          = if adjacent a b xs then swap a b (x:xs) else (x:xs) 
                          | otherwise = error "not adjacent"   
                             where
                             swap _ _ [] = []
                             swap a b (x:xs) 
                                 |    a == x = b : swap a b xs
                                 |    b == x = a : swap a b xs
                                 | otherwise = x : swap a b xs    
我正在使用的相邻函数已定义如下:

adjacent :: Eq a => a -> a -> [a] -> Bool
adjacent a b (x:y:etc)  |  x == a
                        =  y == b
                        |  x == b
                        =  y == a
                        |  otherwise
                        =  adjacent a b (y:etc)
adjacent _ _ _          =  False   
我观察到,根据我的实现,每个元素都会发生交换过程,不仅是第一个元素,还有以下错误:

swapIfAdjacent 'a' 'a' "banana" --> banana

swapIfAdjacent 'b' 'b' "banana" --> error "not adjacent"

以上两个示例都应该生成整个列表,而不是错误。我认为这个错误与“b”只在列表中出现一次“香蕉”而“a”出现多次有关。

您在这里做了很多不必要的工作。这里有一个要考虑的实现。

swapIfAdjacent a b (x:y:xys) | (a, b) == (x, y) || (b, a) == (x, y) = y:x:xys
                             | otherwise = x : swapIfAdjacent a b (y:xys)
swapIfAdjacent _ _ xys = xys

您不需要任何
元素
相邻
交换
,您在这里做了很多不必要的工作。这里有一个要考虑的实现。

swapIfAdjacent a b (x:y:xys) | (a, b) == (x, y) || (b, a) == (x, y) = y:x:xys
                             | otherwise = x : swapIfAdjacent a b (y:xys)
swapIfAdjacent _ _ xys = xys

您不需要任何
元素
相邻
交换

尼斯‌​‍​‍​‍​‍​‍​‍您的实现在很大程度上帮助我理解这个函数是如何工作的。我是哈斯凯尔的新手,很多时候我的想法比我应该想的更复杂‌​‍​‍​‍​‍​‍​‍您的实现在很大程度上帮助我理解这个函数是如何工作的。我是哈斯克尔的新手,很多时候我的想法比我应该想的要复杂得多。