
Nikolay
11.12.2016
20:13:09

KrivdaTheTriewe
11.12.2016
20:55:20
а кто отжимает?
на котлине по факту никто не пишет
а стартапов где скала используется всё больше и больше

Google

Semyon
11.12.2016
20:59:08
Сам видел

Viacheslav
11.12.2016
23:02:48
всем привет, объясните плиз на пальцах чо происходит. http://pastebin.com/6ahjefvW
Смотрим TreeSet lookup элемента происходит за log http://docs.scala-lang.org/overviews/collections/performance-characteristics.html
спрашивается, что сложного запилить метод find который бы требовал логарифмическое время на поиск элемента. Какова хрена там линейное время?
сам допер: непонятно по какому полю я буду искать, поэтому метод find не может искать по сортированному полю в общем случае


Vyatcheslav
12.12.2016
03:24:33
господи, ну сколько можно… На мой взгляд тут нарисованы лезбиянки. Одна одевается как мужчина + 2 одеваются как "обычные" женщины. Меня лично это не уязвляет, а вот тех, кого это действительно уязвляет - подумайте над этим. Не хорошо быт ь гомофобом (а-та-та)
всем привет, объясните плиз на пальцах чо происходит. http://pastebin.com/6ahjefvW
Смотрим TreeSet lookup элемента происходит за log http://docs.scala-lang.org/overviews/collections/performance-characteristics.html
спрашивается, что сложного запилить метод find который бы требовал логарифмическое время на поиск элемента. Какова хрена там линейное время?
Ватс зе проблем?
import scala.collection.immutable.TreeSet
val xs = TreeSet(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
xs.keysIteratorFrom(5).find { v =>
println(v)
v > 5
}
5
6
res0: Option[Int] = Some(6)


Denis
12.12.2016
08:59:38
Как думаете использовать ненаселенные типы в качестве контекста к type class это плохо пахнет? )
Например
trait Encoder[Context, A] {
def encode(a: A): Array[Byte]
}
class Foo[Context] {
def bar[A : Encoder[Context, ?]](a: A) = ???
}
Позволяет юзеру сделать несколько инстансов энкодеров для разных мест.
Фактически это тоже самое что разные имена тайпклассов )
type KafkaEncoder[A] = Encoder[ForKafka, A]
sealed abstract class ForKafka без инстансов

Vladimir
12.12.2016
09:02:51
ну ты точно так же мог поидее просто тэгами помечать конкретный тип, для которого нужен енкодер, и выводить разные энкодеры для разных тегов.
правда с тегами инференс туповато работает
типа Encoder[Foo @@ ForKafka]

Denis
12.12.2016
09:03:36
да теги тоже вариант конечно

Google

Vladimir
12.12.2016
09:03:46
и теги пришлось бы везде прокидывать. так что с контекстом вроде полаконичнее

Denis
12.12.2016
09:04:22
надо в этом направлени покопать, посмотреть что получится )

Vladimir
12.12.2016
09:04:59
да, интересный подход))
я про теги сказал, что это по сути то же самое. и теги вроде бы народ использует, так что мне не кажется что фантомный контекст это что-то плохое

Denis
12.12.2016
09:05:12
А то у меня есть энкодеры для сохранение событий в журнал (протобаф) и энкодеры для паблишинга в кафку (Json). Вот и хочется нормально сделать
А ) ну да

Vladimir
12.12.2016
09:06:04
а ты кстати снапшоты в журнал тоже в протобуфе кладешь?

Denis
12.12.2016
09:06:31
я пока их не использую
пока нет аггрегатов требующих снэпшотттнг
можно же требовать Encoder[Foo] @@ ForKafka
Что кстати более универсально
так как можно что угодно требовать def foo[Context, F[_], A](implicit f: F[A] @@ Context) = f
foo[ForKafka, Encoder, MyEvent] )

Vladimir
12.12.2016
09:16:39
ну да, выглядит ок)

Denis
12.12.2016
09:28:25
хотя все это сводится к partial appllciation любых типов

Dmitry
12.12.2016
10:14:19
о! пошла жара с аннотациями
а я-то все ждал..

Nikolay
12.12.2016
10:15:16
@@ это же не аннотации

?Ivan
12.12.2016
10:15:25

Dmitry
12.12.2016
10:15:27
доооо
окей окей :) не аннотации

Google

Dmitry
12.12.2016
10:15:51
тише-тише.

Grigory
12.12.2016
10:15:59
это теги

Dmitry
12.12.2016
10:16:07
ну да :) совсем другое.

Nikolay
12.12.2016
10:16:11
метааннотации

Dmitry
12.12.2016
10:16:16
??

Nikolay
12.12.2016
10:16:28
когда одной @ мало

James Tiberius Kirk ?
12.12.2016
10:16:34
ща вжухи пойдут

Nikolay
12.12.2016
10:16:35
на помощь приходит вторая

Dmitry
12.12.2016
10:17:02
чтоб подчеркнуть что это точно не аннотации

Grigory
12.12.2016
10:17:04
type @@[+T, U] = T with Tagged[U]

Dmitry
12.12.2016
10:17:05
coconut

Grigory
12.12.2016
10:17:06
держите

Denis
12.12.2016
10:17:06

Grigory
12.12.2016
10:17:11
кормлю

Denis
12.12.2016
10:17:38
так то все аннотации кроме рантайм значений

?Ivan
12.12.2016
10:19:05
http://www.vlachjosef.com/tagged-types-introduction/

Daniel
12.12.2016
10:35:56
профнепригодный тролль
мельчают мифические твари

Aleksey
12.12.2016
10:40:50
http://www.vlachjosef.com/tagged-types-introduction/
В этой теме слегка напрягает две вещи. Во первых совершенно не понятно почему бы тэггинг не вынести в отдельный модуль. Не хочется тянуть шэплес только из за этой фичи на пример. Во вторых напрягает что когда мы делаем tag[User]("aFxtsa1s") инстанцируется новый и совершенно бесполезный экземпляр класса Tagger.

?Ivan
12.12.2016
10:50:49
Вот у меня реально в коде есть куча методов, которые принимают допустим 5 стринговых параметров с разным смысловым контекстом. Хотелось бы их как-то отделить друг от друга, чтобы не ошибиться

Google

Denis
12.12.2016
10:53:23
В шейплесс вроде tag сделаны без лишних аллокейтов

Admin
ERROR: S client not available

Andrey
12.12.2016
10:53:41
А просто case class AccountID(value: String) вообще не вариант?

Aleksey
12.12.2016
10:54:05

Andrey
12.12.2016
10:54:44

Aleksey
12.12.2016
10:55:19

Denis
12.12.2016
10:56:16
А, я вот про это говорил https://github.com/milessabin/shapeless/blob/master/core/src/main/scala/shapeless/typeoperators.scala#L32
но да
можно было сделать через AnyVal

Aleksey
12.12.2016
10:57:00

Denis
12.12.2016
10:57:12
foo: Unit ?
Tager(foo: Unit) extends AnyVal
:)

Dmitry
12.12.2016
10:57:37
?

Aleksey
12.12.2016
10:57:42
Можно было бы переписать как-нибудь типа
object tag {
private val theTagger = new Tagger[Any]
def apply[U] = theTagger.asInstanceOf[Tagger[U]]
trait Tagged[U]
type @@[+T, U] = T with Tagged[U]
class Tagger[U] {
def apply[T](t : T) : T @@ U = t.asInstanceOf[T @@ U]
}
}

Denis
12.12.2016
10:58:14
можно да

Aleksey
12.12.2016
10:59:46
Пойду в жвмчатик спрошу, не заинлайнится ли инстанцирование Tagger уже в рантайме, когда жвм поймет что аллоцировать не имеет смысла.

KrivdaTheTriewe
12.12.2016
11:01:17

Aleksey
12.12.2016
11:01:30
А чем решение с тегами лучше-то?
Тем что без оберток. Этот вот UUID @@ User или там String @@ User это прям вот настоящие UUID и String. То есть если у тебя есть функция которая требует UUID тебе не надо будет делать user.id.uuid.

Google

Oleksandr
12.12.2016
11:04:30
или тут с эстетической точки зрения?

Aleksey
12.12.2016
11:27:06
Если список, то энивалы боксятся

?Ivan
12.12.2016
11:29:09
Что посоветуюте для SOAP клиента?

Grigory
12.12.2016
11:31:33
да только scalaxb есть вроде

Denis
12.12.2016
11:33:34

KrivdaTheTriewe
12.12.2016
11:38:34

?Ivan
12.12.2016
11:39:12

Grigory
12.12.2016
11:40:02
я б на месте scalaxb стековерфлоу кидал) ну попробуй; там протокол сгенерировать дело 5 минут

Aleksey
12.12.2016
12:13:31

Dmitry
12.12.2016
12:14:31
а кто-нибудь встречался с проблемой: если есть тип T[A,B] и L <: HList, то implicit ops.hlist.Selector[L, T[A,B]] не находится, даже если явно указано, что L -- это T[A,B] :: T[A, C] :: HNil? при том если тип зависит от одного типа, то всё ок