2017-03-16 73 views
3

所以我是Haskell的新手,我想知道是否有人可以幫助我。從類型列表中刪除類型haskell

我有一個自定義的數據類型的列表,像這樣:

type Title = String 
type Manager = String 
type Year = Int 
type Fan = String 
type Album = (Title, Manager, Year, [Fan]) 

而且我的專輯

albumDatabase :: [Album] 
albumDatabase = [(...)] 

的預製的靜態數據庫,我有一個返回的功能一個管理者作出的所有專輯:

manAlbum :: String -> [Album] -> [Album] 
manAlbum d database = filter ((\(_,album,_,_) -> d == album)) database 

我的問題是,從所有的經理專輯這個新的列表,我需要ŧ o只檢索粉絲並放棄標題,經理和年份。然而,我不確定如何告訴haskell我只希望返回自定義數據類型的這個字段。

+1

你的問題是不是一個真正的實際問題,但它看起來像你應該使用'map'爲了使一個函數, [[專輯] - > [[粉絲]]' – 4castle

+0

謝謝,更新了我的問題 –

回答

2

正如4castle提到的,你可以使用map

getAlbumFans :: [Album] -> [[Fan]] 
getAlbumFans database = map (\(_,_,_,fans) -> fans) database 

您也可以使manAlbum功能更具可讀性給予它更具描述性的名稱,如getAlbumsByManager和類型簽名與Manager更換String

+0

啊我看到那個出色的作品,謝謝 –

0

另一種解決方案可能是使Album成爲代數數據類型。我想,如下的代碼可能重寫時更容易理解,:

type Title = String 
type Manager = String 
type Year = Int 
type Fan = String 
data Album = Album { title :: Title, manager :: Manager, year :: Year, fans :: [Fan]} deriving (Show) 

albumDatabase :: [Album] 
albumDatabase = [Album {title="A", manager="B", year=5, fans=["a","b"]}] 

check :: Album -> String -> Bool 
check a d=title a==d 

manAlbum :: String -> [Album] -> [[Fan]] 
manAlbum d database = map (\a->fans a) $ filter (\a->title a==d) database