所以我是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
我的问题是,从所有管理员专辑的新列表中,我只需要检索粉丝并删除标题,经理和年份。但是我不确定如何告诉haskell我只想要返回自定义数据类型的字段。
答案 0 :(得分:2)
正如4castle所提到的,你可以使用map
:
getAlbumFans :: [Album] -> [[Fan]]
getAlbumFans database = map (\(_,_,_,fans) -> fans) database
另外,您可以通过为manAlbum
提供更具描述性的名称,并使用getAlbumsByManager
替换类型签名中的String
来使Manager
函数更具可读性。
答案 1 :(得分: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