Yakın bir zamanda IO monad'la nasıl gelebileceğine dair bir video izledim, konuşma scaladaydı. Aslında, işleve sahip olmanın ne anlama geldiğini merak ediyorum. IO nesnesine sarılmış lambda ifadeleri, mutasyonların ne olduğu ve bir noktada gözlemlenmeleri gereken değişimin üstünde olduğu anlamına gelir, yani bir şey gerçekleşir. Sorunu sadece ağacın tepesinde başka bir yere itmiyor musunuz? GörebildiğimScala IO monad: ne anlamı var?
tek yararı da unsafePerformIO operasyonu aramazsam hiçbir yan etkiler görülebilir anlamında, tembel değerlendirme için izin vermesidir. Ayrıca sanırım programın diğer bölümleri/paylaşım kodu kullanabilir ve yan etkilerin gerçekleşmesini istediğinde deciede olabilir. Bu hepsi ise
merak ediyorum? Test edilebilirlikte herhangi bir avantaj var mı? Bu gibi olumsuzlukları gözlemlemeniz gerektiği gibi değil. Eğer özellikler/arayüzler kullandıysanız, bağımlılıkları kontrol edebilirsiniz, ancak etkiler bu bağımlılıklar üzerinde gerçekleştiğinde değil.
kodda Aşağıdaki örnek, bir araya getirdi.
case class IO[+A](val ra:() => A){
def unsafePerformIO() : A = ra();
def map[B](f: A => B) : IO[B] = IO[B](() => f(unsafePerformIO()))
def flatMap[B](f: A => IO[B]) : IO[B] = {
IO(() => f(ra()).unsafePerformIO())
}
}
case class Person(age: Int, name: String)
object Runner {
def getOlderPerson(p1: Person,p2:Person) : Person =
if(p1.age > p2.age)
p1
else
p2
def printOlder(p1: Person, p2: Person): IO[Unit] = {
IO(() => println(getOlderPerson(p1,p2))).map(x => println("Next"))
}
def printPerson(p:Person) = IO(() => {
println(p)
p
})
def main(args: Array[String]): Unit = {
val result = printPerson(Person(31,"Blair")).flatMap(a => printPerson(Person(23,"Tom"))
.flatMap(b => printOlder(a,b)))
result.unsafePerformIO()
}
}
Etkilerin ne kadar iyi olduğunu tahmin ettiğim ana kadar, nasıl ertelendiğini görebilirsiniz. Bunu videodan hissettirdikten sonra ortaya çıktım.
doğru benim uygulanması mı ve benim anlayış doğru mu.
Ayrıca, ValidationMonad [IO [Kişi]] 'de olduğu gibi ValidationMonad ile birleştirilmesinin milaj yapılıp yapılmayacağını merak ediyorum, bu yüzden istisnalar oluştuğunda kısa devre yapabiliriz? Düşünceler lütfen.
Blair
Teşekkürler. Büyük cevap bu fikirlere bir göz atacağım. –
Alt sınıflara ve tür sınıflarına göre bir kod snippet'iniz var mı? –
Drexin'in özellikle ConsoleIO gibi şeylere bağladığı Runar'ın slaytlarına bakın. Bu eylemleri (Eğer örtülü nesne ConsoleEffect .. çalıştırırsanız ne olabilir tanımından IO eylemleri ("vaka nesne GetLine ...", "dava sınıfı PutLine ...") beyanı ayrılığı gösterir. .'). Ama orada başka şeyler de var; Ben söylediğimi _only_ gösteren minimal kod değil. –