说我有以下定义
data Book = Book {id :: Int, title :: String}
type Shelf = [Book]
假设我有一个假设函数(upd 用于更新)
updShelf :: Shelf -> Shelf
updShelf all@(book : books) = updBook book : updShelf books
到目前为止一切都很好。现在假设 updateBook 函数需要在它之前引用更新的书三本书,即书架中位置 5 的书的 updateBook 需要引用位置 2 的书(假设前三本书不需要这样的引用来更新)。没问题,我说,然后修改我的代码:
updShelf :: Shelf -> Shelf
updShelf all@(book : books) prevBook = updBook book prevBook : updShelf books
where prevBook = ???
我需要帮助的是 prevBook 功能。虽然我什至不确定我是否以正确的方式解决这个问题。所以,如果你们有任何更好的建议来以不同的方式解决这个问题,我们将不胜感激
编辑:
Thomas M. DuBuisson:你的解决方案对我不起作用。原因如下:假设初始货架(全部)状态为
Book {id=1, title="a"}
Book {id=2, title="b"}
Book {id=3, title="c"}
Book {id=4, title="d"}
Book {id=5, title="e"}
Book {id=6, title="f"}
Book {id=7, title="g"}
Book {id=8, title="h"}
然后(drop 3 partialUpdate)是(仅使用 ids 而不是整个 book 语句):
updBook 4
updBook 5
updBook 6
updBook 7
updBook 8
zipWith' ($) (drop 3 partialUpdate) (all) 是:
updBook 4 1
updBook 5 2
updBook 6 3
updBook 7 4 -> YIKES! Older version of book 4!
updBook 8 5 -> YIKES! Older version of book 5!
就我而言,我需要根据已经更新的第 4 和第 5 本书的版本来更新第 7 本书和第 8 本书,而不是未更新的。我希望你明白我的意思。