@scala_ru

Страница 154 из 1499
Nick
11.10.2016
07:39:00
Не забыл ли ты про ea

Что он может нахер все это выкинуть

Aleksey
11.10.2016
07:39:35
Google
Wystan
11.10.2016
07:39:40
ктонибудь, кто читал статью De Goes-а про [Onion](http://degoes.net/articles/modern-fp-part-2) разобрался как там подразумевается имплементировать интерпретаторы которые должны выражатся в терминах другого интерпретатора ? вот это все: val bankingLogging : BankingF ~< Halt LoggingF val bankingProtocol : BankingF ~< ProtocolF val protocolSocket : ProtocolF ~< SocketF val loggingFile : LoggingF ~< FileF val execFile : FileF ~> IO val execSocket : SocketF ~> IO
я не читал, но подозреваю, что очередная бесплатная раздача фри монад. Free monads are not free. Мне кажется, что хорошая идея - это написать монад-трансформер, который позволяте комбинировать future, option и делать из них на выходе какой-нибудь spray Response. Это позволит потом в одном читабельном for comprehension использовать любые бизнес-функции и не перегонять их в toFutureOption orError “bla-bla-error”. А использовать монад-трансформеры для бизнес-логики - это очень долго как писать, так и после тебя читать.

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

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

Да я плохой рассказчик, гуглится escape analysis
Не, не прокатит. Там не временный мусор.

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

да и контролировать проще, можно сделать менеджера памяти простенького, который и по обьему ограничить и по времени

Nick
11.10.2016
07:42:11
Не, не прокатит. Там не временный мусор.
Ты все дерево наружу выкидываешь?)

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
@fomkin можно конечно кэшировать дерево, но тебе за память не страшно?)
Ну вот я и хочу кешировать куски дерева таким макаром. Дальше не страшно.

сотни аллокаций - это немного. как же иммутаблы? ))) они постоянно аллокируют)) вот миллионы микроаллокаций в секунды - это да)
Если это мусор то да (см там выше павлов говорит про оптимизацию на этот счет). А так там настоящие объекты, которые потом используются и живут какое-то время. Секунды, может быть даже минуты.

Но это как-то...

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

@fomkin или даже skiplismap

@fomkin и не забыть обернуть все value в softref

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

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
@fomkin кстати, можно попробовать сделать class с lazy val внутри, правда я хз как он себя проведёт пр оом
эм. а как он себя поведет иначе кроме как в соответствии со спецификацией? )) если доступ к полю будет запрошен, значит память выделиться и дальше убьется с очисткой экземпляра хоста, а до тех пор будет выделено только место под адрес для этого поля(ну и место для флажочка - создано, нет) при заведении экземпляра хоста)

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

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
а про thread safety есть?
Да там вообще спека ничего не гарантирует

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
Если где то непонятно с радостью объясню
как быть, если есть 300 вариаций TweetOp ? делать 300 строчек case ?

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
как вариант

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
apply не опцию возвращает
Я про второй вариант

Борис
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 так себе )

Страница 154 из 1499