2017-03-04 49 views
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'多次出現有關。

回答

3

你在這裏做了很多不必要的工作。這是一個需要考慮的實現。

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 

你不需要任何的elemadjacentswap

+0

不錯 – martin

+0

你的實現可以幫助我理解這個函數是如何工作的。我是Haskell的新手,很多時候我想比我應該更復雜。 –