タグ付けされた質問 「zipper」

7
ネストされた構造を更新するためのより明確な方法
次の2つのcase classes があるとします。 case class Address(street: String, city: String, state: String, zipCode: Int) case class Person(firstName: String, lastName: String, address: Address) および次のPersonクラスのインスタンス: val raj = Person("Raj", "Shekhar", Address("M Gandhi Marg", "Mumbai", "Maharashtra", 411342)) 更新したい場合はzipCode、raj次のようにする必要があります。 val updatedRaj = raj.copy(address = raj.address.copy(zipCode = raj.address.zipCode + 1)) ネストのレベルが増えると、さらに醜くなります。update-inそのようなネストされた構造を更新するためのより明確な方法(Clojureのようなもの)はありますか?
124 scala  case-class  zipper 

1
ジッパーがコモナドである理由の理解
これは私の前の質問に対する回答のフォローアップです。 私は、各項目をマッピングする必要があるとa:AのList[A]のb:B機能をdef f(a:A, leftNeighbors:List[A]): Bして生成しますList[B]。 もちろんmap、リストを呼び出すだけではなく、リストジッパーを使用できます。ジッパーは、リスト内を移動するためのカーソルです。現在の要素(focus)とその隣接要素へのアクセスを提供します。 今、私は自分を置き換えることができfて def f'(z:Zipper[A]):B = f(z.focus, z.left)、この新しい関数を渡すf'にcobindする方法Zipper[A]。 これcobindは次のように機能します。f'ジッパーでそれを呼び出してから、ジッパーを移動f'し、新しい「移動した」ジッパーで呼び出し、ジッパーを再び移動し、以下同様に、ジッパーがリストの最後に到達するまで続けます。 最後に、cobindはタイプの新しいジッパーを返しますZipper[B]。これはリストに変換できるため、問題は解決されます。 今の対称性を注意cobind[A](f:Zipper[A] => B):Zipper[B]し、bind[A](f:A => List[B]):List[B]だからこそListであるMonadとZipperされますComonad。 理にかなっていますか?

3
ジッパーコモナド、一般的に
任意のコンテナタイプが与えられると、(要素に焦点を合わせた)ジッパーを形成し、この構造がコモナドであることがわかります。これは最近、次のタイプの別のStackOverflowの質問で非常に詳細に調査されました。 data Bin a = Branch (Bin a) a (Bin a) | Leaf a deriving Functor 次のジッパー付き data Dir = L | R data Step a = Step a Dir (Bin a) deriving Functor data Zip a = Zip [Step a] (Bin a) deriving Functor instance Comonad Zip where ... …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.