在 Haskell 中交换给定列表中的相邻输入字符
swap adjacent input characters in a given list, in Haskell
鉴于 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' 仅在列表中出现一次 "banana" 而 '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
您不需要 elem
、adjacent
或 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
= 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' 仅在列表中出现一次 "banana" 而 '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
您不需要 elem
、adjacent
或 swap
。