Bu tür şeyler için yapıldıkları için kimsenin lens eklememesi komik. Yani, burada üzerinde bir CS arka plan kağıdı olup burada lensler üzerinde dokunmatik kısaca Scala kullanmak bir blog, burada Scalaz için lensler uygulamasıdır ve burada şaşırtıcı sorunuza benziyor onu kullanarak bazı kod vardır. Ve kazan plakasını kısaltmak için, işte vaka sınıfları için Scalaz lensleri üreten bir eklenti.
Bonus puanlar için, işte lenslere değinen başka bir SO sorusu ve Tony Morris'in yazdığı bir makale .
Lenslerle ilgili en önemli şey, bir araya getirilebilir olmalarıdır. Bu yüzden ilk başta biraz hantaldırlar, ancak onları kullandıkça yer kazanmaya devam ederler. Ayrıca, test edilebilirlik için harikadırlar, çünkü yalnızca tek tek lensleri test etmeniz gerekir ve kompozisyonlarını kabul edebilirsiniz.
Öyleyse, bu cevabın sonunda sağlanan bir uygulamaya göre, işte bunu lenslerle nasıl yapacağınız. İlk olarak, bir adresteki bir posta kodunu ve bir kişideki bir adresi değiştirmek için lensleri beyan edin:
val addressZipCodeLens = Lens(
get = (_: Address).zipCode,
set = (addr: Address, zipCode: Int) => addr.copy(zipCode = zipCode))
val personAddressLens = Lens(
get = (_: Person).address,
set = (p: Person, addr: Address) => p.copy(address = addr))
Şimdi, bir kişinin posta kodunu değiştiren bir mercek elde etmek için onları oluşturun:
val personZipCodeLens = personAddressLens andThen addressZipCodeLens
Son olarak, rajı değiştirmek için bu merceği kullanın:
val updatedRaj = personZipCodeLens.set(raj, personZipCodeLens.get(raj) + 1)
Veya biraz sözdizimsel şeker kullanarak:
val updatedRaj = personZipCodeLens.set(raj, personZipCodeLens(raj) + 1)
Ya da:
val updatedRaj = personZipCodeLens.mod(raj, zip => zip + 1)
İşte bu örnek için kullanılan, Scalaz'dan alınan basit uygulama:
case class Lens[A,B](get: A => B, set: (A,B) => A) extends Function1[A,B] with Immutable {
def apply(whole: A): B = get(whole)
def updated(whole: A, part: B): A = set(whole, part) // like on immutable maps
def mod(a: A, f: B => B) = set(a, f(this(a)))
def compose[C](that: Lens[C,A]) = Lens[C,B](
c => this(that(c)),
(c, b) => that.mod(c, set(_, b))
)
def andThen[C](that: Lens[B,C]) = that compose this
}