F, [G [A]] nesneye fonksiyonu:Scalaz monad transformatörleri. Başvuru f1: A => G, [B], f2: B => G, [C] 'iki (veya daha fazla) işlevleri olarak tanımladığımız
val functionM: String => Option[Int] = s => Some(s.length)
val functionM2: Int => Option[String] = i => Some(i.toString)
Ayrıca bazı veriler tanımlamıştır:
val data: List[Option[String]] = List(Option("abc"))
sorum gibi bir sonuç elde etmek için (güzel bir şekilde) fonksiyonlarını oluşturmak için yapılması gerekenler:
data.map(_.flatMap(functionM).flatMap(functionM2))
res0: List[Option[String]] = List(Some(3))
ben li yok Yukarıdaki işlev çağrılarının sözdizimi. Böyle birçok yer varsa, kod çok okunamaz.
Ben OptionT scalaz monad trafosu ile oynamak çalıştı, ama yine de haritalar yuvalanmış ve ayrıca gibi iç içe geçmiş Seçenek oluşturur: :OptionT(data).map(a => functionM(a).map(functionM2)).run
res2: List[Option[Option[Option[String]]]] = List(Some(Some(Some(3))))
Ne elde etmek istiyorum az çok böyle bir şeydir
Something(data).map(functionM).map(functionM2)
veya daha iyi:
val functions = functionM andThenSomething functionM2
Something(data).map(functions)
Try ile çalışabilirse iyi olur. Scalaz'ın TryT monad transformatörüne sahip olmadığını biliyorum, bu yüzden Try üzerinde çalışan fonksiyonları güzel bir şekilde oluşturmak için herhangi bir yol var mı?
'val işlevleri = functionM ve AfterSomething functionM2' işlevlerini' 'Kleisli (functionM)> => Kleisli (functionM2)' ile yapabilirsiniz, ancak bununla ne yapacağına emin değilim ... –