【问题标题】:remove type from type list haskell从类型列表中删除类型 haskell
【发布时间】:2017-08-07 00:26:34
【问题描述】:

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

【问题讨论】:

  • 您的问题并不是真正的问题,但看起来您应该只使用map 来创建一个执行[Album] -> [[Fan]] 的函数
  • 谢谢,更新了我的问题

标签: list haskell types


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    您还可以通过给getAlbumsByManager 等更具描述性的名称并将类型签名中的String 替换为Manager 来使manAlbum 函数更具可读性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-16
      • 2016-03-31
      • 2011-01-05
      相关资源
      最近更新 更多