0
鑑於swapIfAdjacent函數的聲明,我需要做到以下幾點:交換相鄰輸入字符,在Haskell
swapIfAdjacent :: Eq a => a -> a -> [a] -> [a]
如果任一A,B或B,一個是連續的條目,然後這兩個項目的順序的第一個也是唯一的發生應該交換。
我迄今爲止代碼:
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'多次出現有關。
不錯 – martin
你的實現可以幫助我理解這個函數是如何工作的。我是Haskell的新手,很多時候我想比我應該更復雜。 –