
Aleksey
28.08.2017
12:43:58

Daniel
28.08.2017
12:46:39
rollback из логов бота
> Нужен Scala-разработчик в Ташкенте, не для стартапов и вообще это не предложение касательно работы.
хм, теперь все скрытое (адмнами) не минет глаз моих

uzminer
28.08.2017
12:47:55
Как достали удаленное сообщение ??

Google

Daniel
28.08.2017
12:48:19
я здесь бота подсадил
в логах было

uzminer
28.08.2017
12:48:37
Бот на скале написан ?)

Daniel
28.08.2017
12:48:43
ага

uzminer
28.08.2017
12:49:01
В гитхабе есть ?)

Daniel
28.08.2017
12:49:13
честно пробовал на расте, но задолбало модели для апи телеграмма описывать
взял готовую либу скаловую
https://github.com/optician/Telegram-Silencer
немножко пиара для репы
you are welcome to make pullrequest ©

uzminer
28.08.2017
12:50:22

Kirill
28.08.2017
13:03:36
Очередной тупой вопрос, который не даёт покоя.
Допустим, есть какой-то abstract class Foo(bar: String)
Можно ли сделать кейс класс, который бы наследовал его и заполнял своим параметром абстрактный член? Ну типа
case class BarBar extends Foo
BarBar("qwerty"): Foo
Когда подобную фигню надо делать, постоянно дублирую. Жесть какая-то, некрасиво

Nikolay
28.08.2017
13:04:42
abstract class Foo(a: String)
case class Bar(a: String) extends Foo(a)
так чтоли?

Kirill
28.08.2017
13:05:10
Угу

Nikolay
28.08.2017
13:05:24
не нравится что руками приходится прокидывать a?

Google

Kirill
28.08.2017
13:05:34
Ещё бы
Бахнуть три абстрактных параметра и два кейс класса. Масштаб вроде детский, а грязи в исходниках как в конюшне
О, вроде через трейт вместо абстракт класса работает как надо

Alexey
28.08.2017
13:18:54

Kirill
28.08.2017
13:31:31
Смотря для чего, наверно. В моем случае как раз что надо вышло
trait Foo { val name: String }
case class BarCustomer(name: String, age: String)

Mikhail
28.08.2017
14:38:41
trait Foo { val name: String }
case class BarCustomer(name: String, age: String)
abstract class Foo(name:String)
- это параметр конструктора (тобишь параметр конкретного метоа), естественно что наследующий класс не может добавить реализацию параметра для какого-то конкретного метода.
trait Foo{ def name:String }
- это абстрактный член (контрак на реализацию в наследниках. естественно что он может быть реализован через
class Bar(val name:String) extends Foo
, поскольку в данном случае Bar(val name) - name не только параметр конструктора, но и член Bar, который заодно реализовывает контракт из фу

KrivdaTheTriewe
28.08.2017
15:38:59
гитлабупал?

Андрей
28.08.2017
19:01:06

Mikhail
28.08.2017
19:30:05

Denis
29.08.2017
06:42:21
If things stay as they are I see no alternative to bringing back the higher-kinded language import and declaring higher-kinded types officially unsound.
https://github.com/lampepfl/dotty/issues/2887

Vyatcheslav
29.08.2017
06:46:25
Ну реал, L[F[G[_]]] - это уже Эребор какой-то.

Denis
29.08.2017
06:49:42
`L[G[F[_], _]]` - перебор ровно до тех пор пока тебе это не понадобиться

Alexey
29.08.2017
06:53:52

Mikhail
29.08.2017
06:57:31
Ну реал, L[F[G[_]]] - это уже Эребор какой-то.
почитай тред. к тому же проблема не в самих киндертипах как таковых. скорее всего это утрированный пример, который получился в результате различных экспериментов. Можно подобрать примерчик гораздо проще, который также сломается, но проще взять то что уже само нашлось

Oleg
29.08.2017
07:00:51
Учитывая, что субтайпинг-баунды - это чуть ли не основная фича тайпсистемы дотти, выглядит очень тревожно
С другой стороны, может выйти, что сама эта система случайно вышла тюринг полной и проверка хорошести баундов вдруг окажется эквивалентной проблеме останова

Google

Nikolay
29.08.2017
15:52:39
видимо не только тут шутки про go

Aleksei
29.08.2017
15:58:15
ну вот и в профунктор оптикс улетела картинка

Oleg
29.08.2017
16:03:36
наши агенты повсюду

Yurii
29.08.2017
20:30:29

Pavel
29.08.2017
20:46:03
обновил идею - какая херня вылезла с эдитором - файлы не открываются - тупо постое окно без табов на месте эдитора
тока у меня такое?

Aleksey
29.08.2017
20:54:43

Pavel
29.08.2017
20:55:00
помогло
я рестартанул идею на самом деле еще раз и это говно прошло

Alexander
29.08.2017
20:55:52
Всем привет. Пытаюсь подключить js модуль к ScalaJS, выдаёт такое:
[error] (compile:fastOptJS) org.scalajs.core.tools.linker.LinkingException: There were module imports without fallback to global variables, but module support is disabled.
[error] To enable module support, set scalaJSModuleKind := ModuleKind.CommonJSModule.
Ок, меняю на CommonJSModule, проект собирается, но при загрузке страницы выдаёт:
Uncaught ReferenceError: exports is not defined. Не могу понять, что делаю не так.

Aleksey
29.08.2017
20:57:04

Nick
29.08.2017
20:57:12
@fomkin порешал с докером то? или так и забил?)

Alexander
29.08.2017
20:57:55

Denis
29.08.2017
21:13:18
https://github.com/scala/scala/pull/6050

Борис
29.08.2017
21:19:22
чат, а есть что годного почитать про лет ит крэш?

Iaroslav
29.08.2017
21:35:28
там и про error kernel расскажут. и еще там куча полезностей

Vyatcheslav
30.08.2017
08:19:53
@rudogma Привет! А как в supertagged обстоят дела с наследованием? Попытался заюзать вот так: https://pastebin.com/YgJAbMr5 , но asInstanceOf выглядит грязновато. Мб стоит вообще с другой стороны подойти?

Google

Vyatcheslav
30.08.2017
08:24:12
пардон, разобрался )
def parse1(x: Int): Base = Foo(x)
нормально работает. IDEA просто подсвечивает странно

Mikhail
30.08.2017
08:25:35
https://gist.github.com/Rudogma/12ebcdae41423a76a3f59b70ef28607e

Vyatcheslav
30.08.2017
08:27:40
Есть некий код, которому не важно, Foo там или Bar (т.е. он работает с любым Base). Но насчет parse я спрошу

Mikhail
30.08.2017
08:28:55

Vyatcheslav
30.08.2017
08:28:59
прикольно конечно, но читается тяжело :D
спасибо, надо помедитировать


Mikhail
30.08.2017
08:29:30
https://github.com/Rudogma/scala-superquants/blob/master/shared/src/main/scala/superquants/longprecision/length/package.scala
да не. там легко. вот например в этом файлике. делается базовый тип Length (unit family) - для определения семейства длин. затем для каждого юнита Meters & etc - овертег, который является тегом (не мультитегом) к фэмили. Поэтому это получается не мультитегинг, а своеобразное наследование
Учитывая, что тегированное значение сохраняет все свойства основания и может быть использовано как основание, то любой Meters & etc может быть использован там где принимается Length
Но естественно когда ты передаешь в def takeLen(len:Length) => takeLen(5.meters) - ты теряешь инфу о метерс (тайплевел компайлтайм же). но иногда это то, что нужно. в юнитах это имеет значение, потому что метерс не равно километерс, но если овертаггет для кайнд-разделения - то тогда такие вещи могут быть не важны)
и если овертаггет использовать, то имеет смысл для базового типа указывать чуть более развернутое описание типа
object Length extends TaggedType[Long]
type Length[T] = (Long with Tag[Long, Length.Tag]) @@ T // --- вот эта строчка
так с идеей проблем будет меньше, а на юзерспейсе все также останется


Vyatcheslav
30.08.2017
08:36:44
Ок, а что здесь T? Т.е. как будет выглядеть метод, который возвращает неизвестно какой Length (Nano, Meters, ... )?

Mikhail
30.08.2017
08:37:41
там на самом деле можно без T написать. в большинстве случаев тоже самое будет. это мне там для допфишек нужен был Т

Vyatcheslav
30.08.2017
08:39:37
@rudogma хм… https://pastebin.com/R50CCbWd

Mikhail
30.08.2017
08:40:16

Vyatcheslav
30.08.2017
08:41:15
да, точно :D

Google

Mikhail
30.08.2017
08:45:11

Vyatcheslav
30.08.2017
08:45:35
def parse(x: Int): Base[_] = Foo(x)
да, так не работает
could not find implicit value for parameter tagger: supertagged.Tagger[TagIn,Types2.Foo.Type,Types2.Foo.Tag,Sub,Int]

Mikhail
30.08.2017
08:46:35
все вспомнил. мы же тут овертаггет используем. смотри. когда мы просто тегаем, мы тегаем raw основание. но когда мы тегаем Foo который овертаггет, мы должны тегать основание именно овергтаггет. Тобишь не Int, а Base.Type. Итого будет Foo(Base(x))
тайпсейф - он такой, враг не пройдет)

Vyatcheslav
30.08.2017
08:50:25

Mikhail
30.08.2017
08:51:22
Скалац обрезает эфемерные типы

Vyatcheslav
30.08.2017
08:52:34
В принципе да, jmh показал практически одинаковые значения (я бы даже сказал в пределах погрешности). Другое дело, что было бы вообще супер, если б JIT этим даже не занимался

Юрий
30.08.2017
09:10:17

Vyatcheslav
30.08.2017
09:32:02
У меня была идея - сделать это через semanticdb. Типа выключаемая проверка. Сейчас пытаюсь, но кейсов очень много, и хз как оно будет в бою, скорее всего сильно снизит время проверки, чем через compiler plugin.

Юрий
30.08.2017
09:35:08
А как ты там semanticdb будешь использовать? Он же доступен только после полной компиляции.
Семантикдб для тулзов типа scalafix, которые работают над уже скомпилированным кодом

Vyatcheslav
30.08.2017
09:51:14
Да, именно. Грубо говоря, задаешь алиас Weight = Int. Потом проверяешь, что там, где требуется Weight - либо передается Weight, либо пишется что-то вроде foo(x: Weight)
челендж тут в местах типа:
val xs: Seq[Weight] = ???
val ys: Seq[Weight] = xs.map { x: Weight => (x + 1): Weight }
1. Проверить, что пишут x: Weight или x (без указания типа), а не x: Int.
2. (x + 1): Weight
Вообще я согласен, что идея с semanticdb скорее всего провальная. Но инструмент интересный и есть задача, в которой его можно испытать :)

Mikhail
30.08.2017
10:01:43

Vyatcheslav
30.08.2017
10:02:13
Согласен :)