2015-01-15 116 views
0

我正在嘗試學習Haskell,並且嘗試完成示例問題時遇到了問題。問題是根據給定的謂詞排序在Haskell列表即類型是根據謂詞對haskell中的列表進行排序

sort :: (a -> a -> Bool) -> [a] -> [a] 

我到目前爲止的代碼:

sort _ [] = [] 
sort f (x:xs) = 
      let 
      smaller = sort f (filter (f x) xs) 
      bigger = sort f (filter (f x) xs) --error is on this line 
      in smaller ++ [x] ++ bigger 

不是在這個意義上IM正常工作,而不是代碼確定如何採取相反的功能。例如,如果它是一個普通的排序函數,我會使用smaller = quicksort (filter (<=x) xs)bigger = quicksort (filter (>x) xs)這將根據謂詞分解列表,但是如何使用更高階的謂詞來做到這一點?

+0

首先,你需要縮進'smaller'和'更大一些,以便他們通過'let'。其次,你可能想看看'not'函數。 – bheklilr

+0

@bheklilr似乎這樣編譯得很好。 「not」函數應該像「(not f x)」一樣使用嗎?因爲這給我編譯器錯誤。 – Ben

+2

嘗試'(不是(f x))或'(不是$ f x)','f'不是'not'的參數,'f x'是你想給它的參數。 – bheklilr

回答

3

你只需要使用not功能即可反轉布爾:

not :: Bool -> Bool 

f :: a -> a -> Bool 
f x :: a -> Bool 

not . f x :: a -> Bool 

而且你會用它作爲

sort _ [] = [] 
sort f (x:xs) = 
    let smaller = sort f (filter (f x) xs) 
     bigger = sort f (filter (not . f x) xs) 
    in smaller ++ [x] ++ bigger 
相關問題