我一直在试图用清单中的一本新书来代替一本现有的书。这本新书应该有一个名字,页数,评级,它应该显示它每周借出多少次,有3位数。书的顺序应该是相同的,在它被替换后。
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,我就会得到这样的结果:
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
函数将元素从一个列表添加到另一个列表来添加一本书来解决这个问题。然而,我没有使用这一职能的经验,我似乎有一个问题来实现它:
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
发布于 2020-04-26 14:22:27
如果要删除或添加一本书,map
无法帮助您:map
的一个属性是它不能更改列表中的元素数。但是,还有一种使用map
实现此功能的方法:只需映射图书列表中的每个元素,检查每本书是否等于您的旧书,如果是,则用新书:map (\b -> if b == oldBook then newBook else b) bookList
替换它。这应该允许您在不改变元素顺序的情况下用newBook
替换newBook
。
(一个小小的问题:如果你有重复的书,这最终会取代两本相同的书,而不仅仅是一本。如果这对您来说是个问题,您将需要使用另一种方法--在这种情况下,我将使用递归。)
https://stackoverflow.com/questions/61441782
复制相似问题