从类型列表中删除类型 Haskell

3

我刚接触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只返回自定义数据类型中的这个字段。


1
你的问题实际上不是一个具体的问题,但是看起来你应该只需使用map来创建一个函数,该函数执行 [Album] -> [[Fan]] - 4castle
谢谢,我更新了我的问题。 - FracturedPixel
2个回答

2

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

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

您可以通过更改manAlbum函数的名称并将其更改为更具描述性的名称,例如getAlbumsByManager,并在类型签名中将String替换为Manager,从而使其更易读。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接