从类型列表中删除类型哈斯克尔



所以我是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我只想返回自定义数据类型中的此字段。

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

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

此外,您还可以通过为manAlbum函数提供一个更具描述性的名称(如getAlbumsByManager并将类型签名中的String替换为Manager来使它更具可读性。

另一种解决方案可能是使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

最新更新