首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Haskell用新数据替换列表中的数据

Haskell用新数据替换列表中的数据
EN

Stack Overflow用户
提问于 2020-04-26 13:41:50
回答 1查看 91关注 0票数 0

我一直在试图用清单中的一本新书来代替一本现有的书。这本新书应该有一个名字,页数,评级,它应该显示它每周借出多少次,有3位数。书的顺序应该是相同的,在它被替换后。

代码语言:javascript
运行
复制
data Book = Book { name:: String
                   , pages:: Int, rating:: Float
                   , timesLentEveryWeek:: [Float]
              } deriving (Eq,Ord,Show,Read)

testData1 :: [Book]
testData1 =  [Book "Harry Potter"                    374    9.7   [7, 5, 8],
              Book "Percy Jackson & the Olympians"   530    9.8   [3 , 4, 2],
              Book "Star Wars"                       435    9.5   [9 , 7, 10]]

例如,如果我用图书"Don“304 8.9 4,6,3替换图书”哈利波特“374 9.7 7,5,8,我就会得到这样的结果:

代码语言:javascript
运行
复制
Book "Don Quixote"                     304    8.9   [4, 6, 3],
Book "Percy Jackson & the Olympians"   530    9.8   [3 , 4, 2],
Book "Star Wars"                       435    9.5   [9 , 7, 10]]

我试图通过添加removeBook递归函数和通过使用map函数将元素从一个列表添加到另一个列表来添加一本书来解决这个问题。然而,我没有使用这一职能的经验,我似乎有一个问题来实现它:

代码语言:javascript
运行
复制
removeBook :: String -> [Book] -> [Book]
removeBook n (p:ps)
    | n == name p = removeBook n ps
    | otherwise = p : removeBook n ps


replaceBook :: Book -> Book -> [Book] -> String -> [Book]
replaceBook old new booksData oldBookName = map new removeBook oldBookName booksData
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-26 14:22:27

如果要删除或添加一本书,map无法帮助您:map的一个属性是它不能更改列表中的元素数。但是,还有一种使用map实现此功能的方法:只需映射图书列表中的每个元素,检查每本书是否等于您的旧书,如果是,则用新书:map (\b -> if b == oldBook then newBook else b) bookList替换它。这应该允许您在不改变元素顺序的情况下用newBook替换newBook

(一个小小的问题:如果你有重复的书,这最终会取代两本相同的书,而不仅仅是一本。如果这对您来说是个问题,您将需要使用另一种方法--在这种情况下,我将使用递归。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61441782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档