
Diemust
31.05.2017
22:51:33
старый способ объявления анонимного класса
создания* наверно больше слово подходит

Oleg
01.06.2017
04:50:57

Alexandr
01.06.2017
06:16:20
Вот тут я потерялся. Почемуlazy теперь не нужен?

Google

Aleksey
01.06.2017
06:19:33

Alexandr
01.06.2017
06:20:57
Можешь объяснить?

Grigory
01.06.2017
06:27:12
Можешь объяснить?
шаплез лейзи: https://github.com/milessabin/shapeless/blob/master/core/src/test/scala/shapeless/lazy.scala

Kirill
01.06.2017
06:29:43
ого, интересно почему не скалатестом тестируется

Alexandr
01.06.2017
06:30:29
Спасибо!

Kirill
01.06.2017
06:31:22
А тут есть такие, кто тоже тесты пишет с junit, а не скалатест?

Nick
01.06.2017
06:38:07

Arthur
01.06.2017
06:38:29
Specs2 лучше скалатеста

Kirill
01.06.2017
06:38:54
Чем лучше?

Arthur
01.06.2017
06:39:03
Больше сахара, типо beSome

Oleg
01.06.2017
06:39:30
я думал, что скалатест поглотил все остальные либы

Alexandr
01.06.2017
06:39:41
По-моему, даже по звездочкам specs2 популярнее

Arthur
01.06.2017
06:39:42
И матчеры привязаны к типам ( "123" should be 123) зафейлится в компайл тайме

Google

Arthur
01.06.2017
06:40:03
Скалатест не развивается особо даже

Юрий
01.06.2017
06:40:25
а specs2 есть под scalajs?

Kirill
01.06.2017
06:40:35
Да какая разница что там по звёздочкам ) Сабин вон вообще почему-то на junit пишет тесты, мне очень интересно было бы узнать почему

Oleg
01.06.2017
06:40:53
а в спекс2 можно юзать scalacheck овскую фигню?

Aleksei
01.06.2017
06:41:16

Vladimir
01.06.2017
06:41:37

Oleg
01.06.2017
06:42:05
Co8UV3xWgAALxmN.jpg:large (1561×2048)
https://pbs.twimg.com/media/Co8UV3xWgAALxmN.jpg:large

Kirill
01.06.2017
06:42:14
может не любитель сахарка?
хз, может там есть какие-то свои профиты, мне интересно потому что некоторые вещи которые мне приходится писать в тестах скалатест весьма плохо поддерживает

Oleg
01.06.2017
06:43:11

Aleksei
01.06.2017
06:43:46
Я видел все три версии

Evgeniy
01.06.2017
07:20:45
http://underscore.io/blog/posts/2017/05/29/why-we-open-sourced-our-books.html

Oleg
01.06.2017
07:22:27
Наконец-то поконтрибьючу в Lift Cookbook

Aleksei
01.06.2017
07:22:28
Ну кстати да
Мое имя теперь будет в книжке про Cats лол

Alexandr
01.06.2017
07:26:01
Хорош же?

Aleksei
01.06.2017
07:26:54
но вообще в письме писали что опенсорсят как только коты 1.0 выйдут

Evgeniy
01.06.2017
07:28:05
вроде все тут https://github.com/search?q=topic%3Abook+org%3Aunderscoreio&type=Repositories

Nick
01.06.2017
07:38:15
@optician_owl я помню ты мне ссылку кидал на канал про функциональщину, можешь продублировать?

Daniel
01.06.2017
07:40:49
чегось?
знаю только хаскелль и зав типы

Google

Arthur
01.06.2017
07:42:29

Nick
01.06.2017
07:45:48

folex
01.06.2017
08:02:10
А тут вообще есть же модерация? Раньше вроде было, а последнее время не вижу.

?Ivan
01.06.2017
08:22:28
Не успеваешь их банить, они под другими никами всплывают

Aleksei
01.06.2017
08:23:58

Alexey
01.06.2017
08:28:43
банить инакомыслящих?

Grigory
01.06.2017
08:29:14

Alexey
01.06.2017
08:29:32
а вы за ту рекламу marvel-dc

Grigory
01.06.2017
08:29:38
)) да

Alexandr
01.06.2017
09:28:12
Есть вот такая функция
protected def paramToEnum[T <: Enum[T] : ClassTag](name: String): T = {.... }
В ней через Option пытаюсь привести строку к enum и вернуть константу или null
Компиллятор сообщает
Error: Cannot prove that Null <:< T.
.orNull
Попытка подсунуть "мамой клянусь" Null <:< T не проходит, говорит, не знает <:<
Помогите понять, почему каменный цветок не?
именно null - этот код частеньки из java вызывается. Требование такое :(

Alexey
01.06.2017
09:29:03
asIntanceOf

folex
01.06.2017
09:29:33

Alexandr
01.06.2017
09:30:16
.orNull.asInstanceOf[T]
падает

folex
01.06.2017
09:32:21
T :< AnyRef?

Alexandr
01.06.2017
09:32:59
(implicit k: <:<[Null, T])
Не получится, надо именно чтобы enum
вставить paramToEnum[Null <: T <: Enum[T] : ClassTag]
не получилось. Но вот так, как выше с имплиситом работает :(
Буратино тупой, буратино не понимает, почему prove case class прямо в теле нельзя, а как имплисит можно

Grigory
01.06.2017
09:35:06
а что ты хочешь?

Google

Mikhail
01.06.2017
09:35:33
.orNull.asInstanceOf[T]
падает
val enums = implicitly[ClassTag[T]].runtimeClass.getEnumConstants.asInstanceOf[Array[Enum[_]]]
enums.find( _.name().equalsIgnoreCase(name) ) match {
case Some(e) => e.asInstanceOf[T]
case None => null.asInstanceOf[T]
}

Alexandr
01.06.2017
09:37:07

Mikhail
01.06.2017
09:37:13
@ScalaDev хотя стой, ты же сам наепался. тебе надо возвращать Enum[T]
тогда getOrElse(null) прокатит

Alexandr
01.06.2017
09:37:37
не прокатит : )
Компиллято тоже про отсутствие пруфов матерится.

Mikhail
01.06.2017
09:37:58
нет
Компиллято тоже про отсутствие пруфов матерится.
def paramToEnum[T <: Enum[T] : ClassTag](name: String): Enum[T] = {
val enums = implicitly[ClassTag[T]].runtimeClass.getEnumConstants.asInstanceOf[Array[Enum[T]]]
enums.find( _.name().equalsIgnoreCase(name) ).getOrElse( null)
}
оккупай компиляй на здоровье

Alexandr
01.06.2017
09:38:18
Ну, у меня ругается.
null.asInstanceOf работает.Мне в голову не приходило нулл кастить, спасибо

Mikhail
01.06.2017
09:38:41
и так и так работает

Alexandr
01.06.2017
09:40:47
спасибо

Oleksandr
01.06.2017
09:44:48
тот же хак, но под другим углом:
scala> implicit val foo = null.asInstanceOf[<:<[Null,Int]]
foo: <:<[Null,Int] = null
scala> implicitly[Null <:< AnyVal]
res1: <:<[Null,AnyVal] = null

Alexandr
01.06.2017
09:47:32
Спасибо

Alexey
01.06.2017
10:12:58
@notxcain я тут решил порасдуплять реализацию контекста на монадах
https://gist.github.com/notxcain/36eb32687b6b7ed83177721746d368a1
и чот у меня такое чувство, что код должен вернуть контекст == Map("ServiceB.res" -> "odd" или "even")
Правильно же думаю?

Denis
01.06.2017
10:22:29

Alexey
01.06.2017
10:23:01
я не очень секу на каком моменте мапы мержатся

Denis
01.06.2017
10:23:33
они мержаться в операции WriterT#flatMap
Которая требует чтобы контекст был моноидом, чем Map[String, String] и является

Daniel
01.06.2017
10:26:14
полугруппой скорее

Alexey
01.06.2017
10:26:15
ааа, ну ок то есть если у меня где то будет параллельное вычисление с контестом, я получу несколько версий контекста, которые потом надо мержить?

Google

Denis
01.06.2017
10:26:49

Alexey
01.06.2017
10:29:12
или композиции такого рода вообще не предполагают такого использования?

Denis
01.06.2017
10:29:15
надо посмотреть
Посмотрел
если F поддерживает параллелизм - то и WriterT его поддерживает

Alexey
01.06.2017
10:31:01
дак будет две версии или одна? :)

Denis
01.06.2017
10:31:25
две которые потом сами смерджаться

Alexey
01.06.2017
10:33:57
окей, примерно понял что там происходит, спасибо :)

Denis
01.06.2017
10:34:35
Вся магия происходит в WriterT#ap
def ap[Z](f: WriterT[F, L, V => Z])(implicit F: Apply[F], L: Semigroup[L]): WriterT[F, L, Z] =
WriterT(
F.map2(f.run, run){
case ((l1, fvz), (l2, v)) => (L.combine(l1, l2), fvz(v))
})
Хочу сразу сказать что Apply[Future]#map2 определен через flatMap, так что параллелизма там не будет.

Alexey
01.06.2017
10:36:36
ну на этом примере понятно что не будет
так же ведь будет?
val a = someSimpleOperation
.pure[F]
.flatMap { res =>
context.put("ServiceA.step1", res.toString)
.as(res * Random.nextInt(10))
}
val b = a.flatMap { res =>
context.put("ServiceA.step2", res.toString)
.as(res - Random.nextInt(5))
}
val c = a.flatMap { res =>
context.put("ServiceA.step3", res.toString)
.as(res + Random.nextInt(5))
}
b.flatMap(c).flatMap { res =>
context.put("ServiceA.step4", res.toString)
.as(res)
}

Denis
01.06.2017
10:39:41
нет это будут две отдельные ветки

Alexey
01.06.2017
10:40:01
но потом же ведь они сливаются, не?

Denis
01.06.2017
10:40:07
стоп
вру
b.flatMap(c) - не компилится вообще