【问题标题】:How to add an element to a tuple in a list in haskell?如何将元素添加到haskell列表中的元组?
【发布时间】:2015-03-12 12:31:40
【问题描述】:

我有以下类型和数据库:-

type Title = String
type Singer = [String]
type Year = Int
type Fan = String
type Fans = [Fan]

type Song = (Title, Signer, Year, Fans)

type Database = [Song]  

songDatabase :: Database
songDatabase = [("Wrapped up", ["Olly Murs"], 2014, ["Garry", "Dave", "Zoe", "Kevin", "Emma"]),
    ("Someone Like you", ["Adele"], 2011, ["Bill", "Jo", "Garry", "Kevin", "Olga", "Liz"]), 
("Drunk in Love", ["Beyonce", "Jay Z"], 2014, ["tom", "Lucy"])]

我想在列表的最后一个元组中添加一个粉丝。我是通过使用 addToAl 来做到这一点还是可以使用其他方法?

我必须搜索数据并删除它,然后添加我想要的数据吗?或者有没有办法在像你这样的人元组中添加例如“约翰”给粉丝。

【问题讨论】:

    标签: list haskell tuples


    【解决方案1】:

    您不能将元组添加到现有列表中,Haskell 中的所有值都是不可变的。相反,您可以构建一个包含所需值的新列表。实现这一点的最佳方法是首先编写一个可以为单个电影添加粉丝的函数:

    addFan :: Fan -> Song -> Song
    addFan fan (title, singer, year, fans) = ???
    

    然后你可以写一个函数更新数据库中的特定歌曲:

    addFanInDB :: Fan -> Title -> Database -> Database
    addFanInDB fan songTitle [] = []
    addFanInDB fan songTitle (song:db) = ???
    

    因为这看起来很像家庭作业,所以我不会给你一个完整的解决方案,因为这违背了作业的目的。您需要自己填写???

    【讨论】:

    • 我不想将整个元组添加到列表中,我只想添加一个值,例如“John”给像你这样的人元组中的粉丝。你不能这样做吗?如果没有,我会尝试上述方法并尝试解决
    • @TomPhillippe 你不能修改haskell中的任何值,按照设计它们是不可变的。您需要构造一个新值,而不是修改现有值。
    • 在addFanInDB中使用递归时是否调用addFan函数?
    • @TomPhillippe 正确。基本上,您要做的是使用模式匹配和递归遍历列表。当您找到与songTitle 匹配的歌曲时,请使用addFan fan song 创建一首新歌曲来代替它。或者,您可以编写另一个执行 \song -> if songTitle == titleOfSong song then addFan fan song else song 的函数,该函数仅在标题匹配时创建一个新函数,然后您可以将 map 与该新函数一起使用。
    • 我对haskell很陌生,在你上面给出的例子中,我已经设法让addFan工作,然后我明白第二个??我需要一个递归调用来检查数据库中的songTitle,然后你使用addFan fan song 添加它,但是我看到用户正在输入一个数据库,我在哪里使用它?
    猜你喜欢
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 2015-08-01
    • 2012-04-28
    • 2019-02-26
    • 1970-01-01
    • 2021-05-17
    • 2021-12-27
    相关资源
    最近更新 更多