2013-10-11 28 views
1

我想檢查列表中的元素,然後如果它們比較大,那麼下一個然後交換它們的位置。我不能走得更遠比下面的代碼更改Haskell中的列表中的元素

change [] =[] 
change (x:xs) 
     | x > head xs = change (head xs : x : tail xs) 
     | otherwise = change xs 

main = do 
print $ change [3,2,4] 
-- expected [2,3,4] 
+0

這個你應該通過你的歷史並標記最佳答案「回答」,以便回答您的​​問題的友善人士可以獲得互聯網點 – jberryman

+0

@jberryman當然,我會這樣做,謝謝。 – Amir

回答

2

您需要考慮以下3種基本情況:1)空列表,2)包含一個元素的列表,以及3)包含兩個或更多元素的列表。如果單獨考慮這三種情況下,該功能是很容易定義:

change :: Ord a => [a] -> [a] 
change [] = [] 
change (x:[]) = [x] 
change (x1:x2:xs) 
    | x1 > x2 = x2 : change (x1 : xs) 
    | otherwise = x1 : change (x2 : xs) 

編輯作爲@kqr已經指出的那樣,你可以重新組合成

change :: Ord a => [a] -> [a] 
change (x1:x2:xs) 
    | x1 > x2 = x2 : change (x1 : xs) 
    | otherwise = x1 : change (x2 : xs) 
change other = other 
+1

如果你允許自己重新排序定義,你可以將前兩種情況合併爲'change other = other'。 – kqr

+0

@kqr好點,加入回答 – bheklilr

+0

@bheklilr&kqr謝謝。在輸入變化時:[4,5,2,3]輸出將是[4,2,3,5]。你知道如果我想把[2,3,4,5]作爲一個輸入進行輸入嗎? – Amir

1

你試過:

change [] =[] 
change [x] = [x] 
change (x:xs) 
     | x > head xs = (head xs) : change (x : tail xs) 
     | otherwise = x : (change xs) 

你失去了陣頭中,否則情況。