假设我有以下定义
data Book = Book {id :: Int, title :: String}
type Shelf = [Book]
假设我有一个假设的功能(upd用于更新)
updShelf :: Shelf -> Shelf
updShelf all@(book : books) = updBook book : updShelf books
到目前为止一切都很好。现在假设 updateBook 函数需要引用updated预订它之前的三本书,即书架中位置 5 的书的 updateBook 需要引用位置 2 的书(假设前三本书不需要这样的引用来更新)。没问题,我说,然后修改我的代码:
updShelf :: Shelf -> Shelf
updShelf all@(book : books) prevBook = updBook book prevBook : updShelf books
where prevBook = ???
我需要帮助的是 prevBook 功能。尽管我什至不确定我是否以正确的方式解决这个问题。因此,如果你们有更好的建议以不同的方式解决这个问题,我们将不胜感激
EDIT:
托马斯·M·杜布森:你的solution https://stackoverflow.com/a/12145053/1003417对我不起作用。原因如下:
假设初始货架(全部)状态为
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 3partialUpdate)是(仅使用id而不是整个书本声明):
updBook 4
updBook 5
updBook 6
updBook 7
updBook 8
zipWith' ($) (drop 3partialUpdate) (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 本书。我希望你明白我想传达的意思。