Добрый день. Подскажите по обфускации. Нашёл sbt-proguard, подключал уже и как в документации и как в примере. В итоге sbt proguard
создаёт proguard.jar, правда ругается
[error] Warning: can't write resource [META-INF/INDEX.LIST] (Duplicate jar entry [META-INF/INDEX.LIST])
java -jar proguard.jar
, получаю Type scala.Symbol not present
, которая в sbt assembly вроде как исправлена.val o1: Option[Int] = Some(42)Читать полностью…
val o2 = o1.flatMap2(x => Some(x + 10))
val o2_2 = Monad[Option].flatMap2(o1)(x => Some(x + 10))
trait Monad[F[_]] {Читать полностью…
def flatMap2[A, B](fa: F[A])(f: A => F[B]): F[B]
def flatten2[A](fa: F[F[A]]): F[A] = flatMap2(fa)(identity)
}
object Monad {
def apply[F[_]](implicit instance: Monad[F]): Monad[F] = instance
implicit val monadOption = new Monad[Option] {
override def flatMap2[A, B](fa: Option[A])(f: A => Option[B]): Option[B] = fa.flatMap(f)
}
implicit class MonadOps[A, F[_]: Monad](self: F[A]) {
def flatMap2[B](f: A => F[B]): F[B] = Monad[F].flatMap2[A, B](self)(f)
}
implicit class MonadFlat[A, F[_]: Monad](self: F[F[A]]) {
def flatten2 = Monad[F].flatten2(self)
}
}
object Main {
import Monad._
def main(args: Array[String]): Unit = {
val o1: Option[Int] = Some(42)
val o2 = o1.flatMap2(x => Some(x + 10))
val o3: Option[Option[Int]] = Some(Some(42))
val o4 = o3.flatten2
println(o4)
}
}
implicit class MonadOps[F[_]: Monad](f: F[_]){
def flatten2[A](implicit f: F[F[A]]): F[A] = Monad[F].flatten2(f)
}
у вас тут два раза параметр f
вам не нужен второй, не нуежн имлписит вообще
у вас есть инстанс тайп класса для типа Option, так?
а тип переменной для которой вы ходите вызвать - Some
для типа Some у вас инстанса тайп класса нету
и попробуйте не через экстеншн метод, а нпярямую вызвать Monad.apply[Option].flatten2(oo)
Читать полностью…всем привет, есть тестовый трейт Monad в котором определен метод flatten2.
trait Monad[F[_]] {
def flatMap2[A, B](fa: F[A])(f: A => F[B]): F[B]
def flatten2[A](f: F[F[A]]): F[A] =
flatMap2(f)(fa => fa)
}
object Monad {
def apply[F[_]](implicit instance: Monad[F]): Monad[F] = instance
implicit val optionMonad: Monad[Option] = new Monad[Option] {
override def flatMap2[A, B](fa: Option[A])(f: A => Option[B]): Option[B] = fa.flatMap(f)
}
implicit val listMonad: Monad[List] = new Monad[List] {
override def flatMap2[A, B](fa: List[A])(f: A => List[B]): List[B] = fa.flatMap(f)
}
implicit val setMonad: Monad[Set] = new Monad[Set] {
override def flatMap2[A, B](fa: Set[A])(f: A => Set[B]): Set[B] = fa.flatMap(f)
}
implicit class MonadOps[F[_]: Monad](f: F[_]){
def flatten2[A](implicit f: F[F[A]]): F[A] = Monad[F].flatten2(f)
}
}
}
val oo = Some(Some("foo"))
val o = oo.flatten2
println(o)
вас не смущает что у вас две разных переменных 'f' в одном скоупе?
попробуейте объяснить каждую из них и решить какая не нужна
если определять так
implicit class MonadOps[F[_]: Monad](f: F[_]){
def flatten2[A](f: F[F[A]]): F[A] = Monad[F].flatten2(f)
}
val ll2 = List(List("foo"))
val l2 = ll2.flatten2
println(l2)
missing arguments for method flatten2 in class MonadOps;Читать полностью…
follow this method with `_' if you want to treat it as a partially applied function
val l2 = ll2.flatten2
val oo = Some(Some("foo"))
val o = Monad.apply[Option].flatten2(oo)
println(o)
но выводит ошибку
could not find implicit value for parameter f: List[List[A]]Читать полностью…
val o = oo.flatten2
это никак не связано с тем что я сказал. у вас все еще тип переменной и соответственно монады это Some, но нет инстанса для типа Some (если вообще в этом дело)
Читать полностью…Что и зачем стоит посмотреть.
Для общего развития:
— DDD Aggregate — чтобы научиться лучше проектировать сервисы (после просмотра видео это произойдёт, я почти гарантирую это)
— Шансы на мэйнстрим — если вы фан Scala и хотите, чтобы от 33-минутного видео у вас стало теплее на сердце от будущего языка
Для изучения интересных архитектурных кейсов:
— Protobuf в движении — как можно строить динамические CRUD на proto-схемах
— Alien: Typesafe DSL для доступа к Java foreign memory API — как шустро шелестеть байтиками для быстрого поиска по объявлениям Вертикалей
Доклады на разные конкретные темы:
— Позвольте уточнить — для всех, кому интересны проверки на типах в Scala, в том числе refined-типах
— R&D: Динамические sql-запросы на Scala в рамках проблемы text-to-sql — если интересно узнать больше про графовые БД в формате стендапа
Также, аннотации докладов можно почитать здесь: https://events.yandex.ru/events/vertech/fscala