2015-12-09 20 views
5

yoluyla değiştirme haritası. Ne yazık ki, yeni başlayanlar için öğrenme materyallerine çok az şey olduğunu öğrendim (vanilla Scala'da FP'nin temellerini biliyorum, Scalaz yok). Resmi öğretici, kolay örneklerden (ve/veya sonuçlarından) yoksundur ve oldukça karmaşık Scalaz kütüphanesinde karıştırır. Bir Haritaya erişim gibi önemsiz bir görevin ilk sayfada ele alınacağını varsayalım. Ben at ve index gördütüm bu fantezi boilerplate-az <code>@Lenses</code> ile iyi (benim noobish perspektiften) Ben lensler denemek istedim ve Monocle kütüphane gibiydi Monocle

@Lenses case class House(presentsDelivered: Int) 

    type Houses = Map[(Int, Int), House] 

    @Lenses case class Town(houses: Houses) 

    @Lenses case class Santa(x: Int, y: Int) 

    @Lenses case class World(santa: Santa, town: Town) 

, ancak hiçbir basit örnekler (applyOptional ile sadece tuhaf [benim için sihirli] cevap klişe gerekli olan):

Ben şu pasajı var. Haritayı güncelleştirmek istiyorum - housesTown. sözdizimsel yanlış

(World.town ^|-> Town.houses ^|-> index((x, y)) ^|-> House.presentsDelivered) 
    .modify { _ + 1 }(world) 

, ama ben (belirtilen x, y koordinatlarda House ait presentsDelivered değiştirmek) ne yapmak istediğini açıkça düşünüyorum: Ben bu ruhu içinde bir şey çalışıyordu. Benim sorum haritaya erişmek için nasıl index bölüm değiştirmek için?

Herhangi bir yardım, ipucu ya da çaylak dostu öğrenme materyalleri ipuçları açıktır.

import monocle.function.all.index 
import monocle.std.map._ 

(
    World.town    ^|-> 
    Town.houses    ^|-? 
    index((0, 0))   ^|-> 
    House.presentsDelivered 
).modify(_ + 1) 

Not ben hemen ^|-? ile endeks önceki ^|-> yerini ettik:

+1

Belgelerin yetersizliğinden dolayı üzgünüz, bunun üzerinde çalışıyoruz. Monocle gitter'e kadar tereddüt etmekten çekinmeyin, burada veya github hakkında soru sorun. –

cevap

7

Kelimenin tam anlamıyla uzakta çözeltisinden bir karakter (ve belki bir ithalat) konum. Bu gereklidir, çünkü index((x, y)) temel olarak World.town ve kasa sınıfı üyeler için üretilen makrodan üretilen diğer merceklerden farklıdır. , noktasını işaret edemiyor, index ise, haritada verilen dizede değer yoksa başarısız olabilir. Monocle'nin türleri açısından, Optional[Houses, House], World.town ise Lens[World, Town]'dur.

Opsiyoneller lenslerden daha bir anlamda zayıf ve isteğe bağlı olan bir lens oluşan bir kez, size daha lensler oluşturmak bile isteğe bağlı öğeleri yaşamaya devam edeceğiz. Yani şu bir lens:

World.town ^|-> Town.houses 

Ama bu isteğe bağlıdır:

World.town ^|-> Town.houses ^|-? index((0, 0)) ^|-> House.presentsDelivered 

Monocle sürekli merceklerle x (lensler, yardımcı geçişleri vs.) farklı oluşturmak için x ^|-> y kullanır, ve isteğe bağlı olarak farklı x s oluşturmak için x ^|-? y. Ben şahsen biraz kafa operatörleri bulup vb composeLens, composeOptional, tercih, ama tadı değişir ve operatörleri ezberlemek istiyorsanız en azından kullandıkları yaptığımızdan emin tutarlı-bilmen gerekiyor olabilir hangisi sizi belirli bir tür için ihtiyaç.

sizin koduyla diğer potansiyel sorun, sadece bu yazamazsınız şudur:

index türü için Index tip sınıfının bir örneğini gerektirir, çünkü bu kendi başına derlemek olmaz
import monocle.function.all.index 

val houses: monocle.Optional[Houses, House] = index((0, 0)) 

o . o Monocle çalışacak haritalar için genel bir örnek teşkil eder, bu durumda Map[(Int, Int), House] içinde (içine indeksleme, ama bunu ithal etmek zorunda:

import monocle.std.map._ 

ben learnin için herhangi korkunç iyi önerimiz yok korkuyorum g materyalleri, ancak burada her zaman soru sorabilir ve Monocle Gitter channel oldukça aktiftir.

+0

Tam ve doğru bir cevap için teşekkür ederiz. Dürüst olmak gerekirse, bir cevap alma konusunda çok iyimser değildim - Monocle kütüphanesinin ne kadar popüler olduğunu bilmiyorum, ancak [tag: monocle-scala] etiketi çift hanede bile değildi. Yanlış olduğuma sevindim, yarın bunları [Noel bulmacaları] (http://adventofcode.com/) :) çözmek için biraz eğleneceğim. – monnef