2016-10-29 124 views
1

我想排序兩種不同類型的列表。要做到這一點,我首先創建一個Wrapper類型,所以我可以mappend這兩種類型。不同類型的排序列表

  1. 是否有Wrapper在這裏輸入正確的方法?
  2. 我不是我應該怎麼做實際的排序清楚,如果我想用增量鍵進行排序(即fooDeltabarDelta

代碼:

import   Data.List (sortBy) 
import   Data.Monoid 
import   Data.Ord (comparing) 

data Foo = Foo 
    { fooLabel :: String 
    , fooDelta :: Int 
    } deriving (Show, Eq) 

data Bar = Bar 
    { barLabel :: String 
    , barDelta :: Int 
    , barAnother :: String 
    } deriving (Show, Eq) 

data Wrapper = WFoo Foo | WBar Bar 
    deriving (Show, Eq) 

sortTest :: [Wrapper] 
sortTest = 
    listFoo <> listBar 
    where 
     listFoo = [WFoo $ Foo "label1" 0, WFoo $ Foo "label2" 2] 
     listBar = [WBar $ Bar "label1" 1 "another1"] 
+0

您對元素的排序是什麼? – dkasak

+0

對不起,我已經更新了排序要求的問題。 – amitaibu

回答

2

一包裝類型絕對是一個很好的方法來做到這一點。由於您只是想根據成分Int值對包裝值進行分類,因此可以使用Data.List.sortOn

定義,其提取所述增量值的函數:

delta :: Wrapper -> Int 
delta (WFoo f) = fooDelta f 
delta (WBar b) = barDelta b 

然後使用sortOn這樣的:

main :: IO() 
main = print $ sortOn delta sortTest 

這給出了你的例子下面的輸出:

[WFoo (Foo {fooLabel = "label1", fooDelta = 0}),WBar (Bar {barLabel = "label1", barDelta = 1, barAnother = "another1"}),WFoo (Foo {fooLabel = "label2", fooDelta = 2})] 

另一個方法是爲包裝類型定義一個Ord實例。然後你可以簡單地在你的[Wrapper]列表上使用sort

+1

dkasak你的偉大答案和解釋非常感謝。感謝您讓Haskell更平易近人! – amitaibu

+0

非常歡迎! – dkasak