
Nick
11.10.2016
07:39:00
Не забыл ли ты про ea
Что он может нахер все это выкинуть

Aleksey
11.10.2016
07:39:35

Google

Wystan
11.10.2016
07:39:40


Nick
11.10.2016
07:39:55
Расскажи
Да я плохой рассказчик, гуглится escape analysis

Aleksey
11.10.2016
07:40:01
Таки откуда
Там такая задача. Нужно строить большие-большие деревья.

Mikhail
11.10.2016
07:40:48
мне кажется проще ручками назначить очистку) вполне нормальное явление)
да и контролировать проще, можно сделать менеджера памяти простенького, который и по обьему ограничить и по времени

Evgeniy
11.10.2016
07:41:48

Nick
11.10.2016
07:42:11

Aleksey
11.10.2016
07:42:19

Nick
11.10.2016
07:42:58
@fomkin можно конечно кэшировать дерево, но тебе за память не страшно?)

Vadim
11.10.2016
07:43:01
в том виде как ты описываешь задачу - это невозможно сделать

Nick
11.10.2016
07:43:19
@fomkin и как часто одно и тоже дерево считается

Mikhail
11.10.2016
07:43:39
Там сотни аллокаций.
сотни аллокаций - это немного. как же иммутаблы? ))) они постоянно аллокируют)) вот миллионы микроаллокаций в секунды - это да)

Google

Aleksey
11.10.2016
07:43:39
Но это как-то...

Nick
11.10.2016
07:47:19
@fomkin ок, ну тогда самое просто и крутое что я вижу, это сделать это через мету и конкарент мапу
@fomkin или даже skiplismap
@fomkin и не забыть обернуть все value в softref

Aleksey
11.10.2016
07:50:50

Nick
11.10.2016
07:51:24
Зачем?
Чтоб если память кончится, jvm прибило это уг

Aleksey
11.10.2016
07:51:59

Nick
11.10.2016
07:52:33
@fomkin вообще можно простой lru написать)))
@fomkin ConcurrentMap<K, V> cache = new ConcurrentLinkedHashMap.Builder<K, V>() .maximumWeightedCapacity(1000) .build(); в качестве ключа юзаешь функцию и параметры)
@fomkin https://code.google.com/archive/p/concurrentlinkedhashmap/
@fomkin кстати, можно попробовать сделать class с lazy val внутри, правда я хз как он себя проведёт пр оом

Mikhail
11.10.2016
08:04:09
это же как и многое другое - больше синтаксический сахар)

Denis
11.10.2016
08:05:40

Nick
11.10.2016
08:05:41
Mikhail да, только спека частенько пиздит)
Только недавно дедлок зафиксили(вроде)

Denis
11.10.2016
08:06:13
Единственное что я не совсем понял я отписал вопросм к статетье но пока не джон не отвтил

Google

Evgeniy
11.10.2016
08:06:14

Denis
11.10.2016
08:07:14
идея интерпретировтаь одну алгебру в другую

Nick
11.10.2016
08:07:29
Mikhail хотя в спеке нет про дедлок не слова))) (

Denis
11.10.2016
08:07:30
пример попробую щас накидать

Mikhail
11.10.2016
08:07:40

Evgeniy
11.10.2016
08:08:05

Nick
11.10.2016
08:10:44

Mikhail
11.10.2016
08:10:57
тогда и претензий к ней нет)

Nick
11.10.2016
08:12:00
На самом деле у скалы спека очень мелкая, можно сказать что скала нихера не гарантирует)

Mikhail
11.10.2016
08:12:31
это да, не структурирована совсем(

Nick
11.10.2016
08:12:51
На самую важную часть Одерски положил болт

Evgeniy
11.10.2016
08:15:34


Denis
11.10.2016
08:19:17
спасибо, будет интересно глянуть
Пусть есть два языка
Для работы с твитами
sealed trait TweetOp[A]
case class GetTweets(userId: String) extends TweetOp[List[Tweet]]
...
И для работы с Http
sealed trait HttpOp[A]
object HttpOp {
def get[A](url: String, decoder: Decoder[A]): Free[HttpOp, A] = Free.liftF(Get(url, decoder))
case class Get[A](url: String, decoder: Decoder[A]) extends HttpOp[A]
}
...
Пусть у тебя есть некая программа
program: Free[TweetOp, List[Tweet]]
и есть только интерпретатор httpToFuture: HttpOp ~> Future.
А нужен TweetOp ~> Future.
Значит не хватает TweetOp ~> Free[HttpOp, ?] или как у Джона alias TweetOp ~< HttpOp
ну и делаем его
val tweetToHttp = Lambda[TweetOp ~> Free[HttpOp, ?]] {
case GetTweets(userId) => HttpOp.get(s"user/$userId/tweets", Decoder[List[Tweet]])
...
}
val httpProgram: Free[HttpOp, List[Tweet]] = program.foldMap(tweetToHttp)
val future = httpProgram.foldMap(httpToFuture)
или
val tweetToFuture: TweetOp ~> Future = λ[TweetOp ~> Future](x => tweetToHttp(x).foldMap(httpToFuture))
тогда
val future = program.foldMap(tweetToFuture)
это вроде как transpiler называется
то есть мы программу на одном языке выражаем через другой
Если где то непонятно с радостью объясню


Evgeniy
11.10.2016
08:28:33
ну примерно понятно теперь, надо попробовать будет - я как то не догадался что через тайп лямду можно
попробую поигратся тогда может конкретные вопросы появятся

Denis
11.10.2016
08:29:19
окей

Mikhail
11.10.2016
08:32:51

Denis
11.10.2016
08:33:10
можно дробить на под алгебры

Google

Evgeniy
11.10.2016
08:34:07
@notxcain
а вот тут он что имеет в виду? - какие utility functions есть для того чтобы это все миксовать?
After implementing these interpreters, you can wire them together by using a bunch of seemingly unfamiliar utility functions that ship with Free implementations (more on this later).

Denis
11.10.2016
08:37:41
ну я кроме как foldMap и compile ничего интересного не нашел

Wystan
11.10.2016
08:47:35
Посоны тяготеют к заумному коду. Паттерны умерли, да здравствуют паттерны!

Denis
11.10.2016
10:02:06
Если у кого есть учетка JetBrains, прошу зайти и проголосовать за тикет https://youtrack.jetbrains.com/issue/SCL-10844

Alex
11.10.2016
10:41:24
почему паттерны умерли
фриманатка это тоже паттерн

Aleksei
11.10.2016
10:41:53
надо уже привинтить куда то! а то скоро в кровавом энтерпрайзе будет все во фримонадах!

Alex
11.10.2016
10:42:04
что привинтить?

Alexander
11.10.2016
10:42:20

Aleksei
11.10.2016
10:43:11
фримонады куда нибудь!

Admin
ERROR: S client not available

Alex
11.10.2016
10:43:50
а, в смысле в своём коде

Aleksei
11.10.2016
10:44:17
ды да
а то как лох

Vladimir
11.10.2016
12:32:25
Map[String, String] vs Map[String, Option[String]]
если я не гарантирую, что для какого то ключа будет значение, что "идеоматичнее" ?

Igor
11.10.2016
12:32:50
Первое

Ivan
11.10.2016
12:33:03
Так map же позволят option получить

Igor
11.10.2016
12:33:55
.get она и есть String=>Option[String]

Vladimir
11.10.2016
12:34:01
я тож к первому склоняюсь, но всегда же можно себе в ногу выстрелить через apply(key)

Aleksei
11.10.2016
12:37:00
можно мапу создавать с дефолтным вэлью

Google

Aleksei
11.10.2016
12:37:02
как вариант

Alexey
11.10.2016
12:38:17

Aleksei
11.10.2016
12:38:44
apply не опцию возвращает
апплай тут я так понимаю от PartialFunction

Vladimir
11.10.2016
12:39:36
эффект монопенисуальный по сути)

Aleksei
11.10.2016
12:43:31
@leammas http://scastie.org/22906
=) нормас отработало

Vladimir
11.10.2016
12:45:01
у меня там можно не напрягаясь для всех ключей свои дефолтные значения извлечь)

Alexey
11.10.2016
12:47:01

Борис
11.10.2016
12:47:20
только надо помнить что дефолтные значения после функций типа map превращаются в тыкву

Rishat
11.10.2016
13:10:17
Я про второй вариант
Так там же все равно будет NoSuchElementException, ну если только не делать дефолтным None

Alexey
11.10.2016
13:12:38
Я и говорю что человек сомневается в одинаковых вещах.
Вы читали на что я ответил то?
В 90% нет смысла в Map[Key, Option[Value]]

Oleksandr
11.10.2016
13:13:04
я бы сказал, что в 100%
не могу придумать подходящий кейc

Alex
11.10.2016
13:20:03
ну если наличие ключа тоже несёт какую то информацию

Vladimir
11.10.2016
13:20:15
может кто-то хочет явно задавать что надо брать default значение для каких-то ключех, но при этом оставить строгую проверку по ключам
типа map = Map('key1' -> Some(Value), 'key2' -> None)
но типа если нет key3

Alex
11.10.2016
13:20:25
можно ж сделать map.keys и прогнать

Vladimir
11.10.2016
13:20:32
то должно ругаться типа нет key3
а не брать его дефолтное значение
но case так себе )