次の定義があるとします
data Book = Book {id :: Int, title :: String}
type Shelf = [Book]
私は仮説的な機能を持っていると仮定します(updは更新用です)
updShelf :: Shelf -> Shelf
updShelf all@(book : books) = updBook book : updShelf books
これまでのところすべて順調です。ここで、updateBook 関数が更新された本を 3 冊前に参照する必要があるとします。つまり、本棚の位置 5 にある本の updateBook は、位置 2 にある本を参照する必要があります (最初の 3 冊の本は、更新するためにそのような参照を必要としないと仮定します)。問題ありません、と私は言い、コードを次のように変更します。
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) は次のとおりです (book ステートメント全体ではなく ID のみを使用):
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 を更新する必要があります。私が伝えたいことを理解していただければ幸いです。