我想檢查列表中的元素,然後如果它們比較大,那麼下一個然後交換它們的位置。我不能走得更遠比下面的代碼更改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]
我想檢查列表中的元素,然後如果它們比較大,那麼下一個然後交換它們的位置。我不能走得更遠比下面的代碼更改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]
您需要考慮以下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
你試過:
change [] =[]
change [x] = [x]
change (x:xs)
| x > head xs = (head xs) : change (x : tail xs)
| otherwise = x : (change xs)
你失去了陣頭中,否則情況。
這個你應該通過你的歷史並標記最佳答案「回答」,以便回答您的問題的友善人士可以獲得互聯網點 – jberryman
@jberryman當然,我會這樣做,謝謝。 – Amir