Vasily
Vasily
Бизнес операция - это, например, "осуществи привязку карты, потом переведи Петрову 100р, отвяжи карту, если сегодня вторник"
Vasily
В общем, покамест идея нуждается в дальнейшем осмыслении с моей стороны
Vasily
Я вот прямо готовое решение не могу предложить
Roman
ок. Я пока набросаю свою версию интерпретатора и закину на ревью в чат)
Vasily
Давай
Shub
Тебе сколько лет?
старше меня тут только падре, ну и может еще один-два человека из неактивным. это была аппеляция к авторитету?
Shub
https://www.quora.com/How-overrated-is-functional-programming/answer/Richard-Kenneth-Eng
Romɑn
Крылатый
Доброе утро!
Vasily
Коллеги, а у нас хоть один дебаггер умеет в инлайн функции вставать?
Ayrat
Ayrat
Это недебажится
Ayrat
но в целом, в целом
Vasily
Понимаю, но это больно
Ayrat
Я вот думаю что это не должно быть НАСТОЛЬКО больно - сделать нормальные символы для инлайн функций
Ayrat
а может и больно
Vasily
Надо @fvnever сказать , он любит делать больно
Vasily
Ох я печаль нарыл - LiteDb не умеет работать с type alias, походу, что логично
Vasily
Еще прикол, конечно: https://sharplab.io/#v2:DYLgZgzgNAJiDUAfA9gBwKYDsAEBlAnhAC7oC2AsAFBH4bYDCAvMQE4CWmA5kA==
Ayrat
Так. нужен код ревью от любителей скалировать.
примитивная задача с кодварс
есть массив строк вида
"ABCD 20", где первая буква - категория, дальше неизвестное кол-во рандомных букв и цифра - кол-во товара в категории.
Дан массив таких товаров и дан массив категорий.
Надо найти кол-во товаров по данным категориям.
Пример
товары = Array("ABART 20", "CDXEF 50", "BKWRK 25", "BTSQZ 89", "DRTYM 60")
категории = Array("A", "B", "C", "W")
результат
(A : 20) - (B : 114) - (C : 50) - (W : 0)
мой говнокод
val artRegex: Regex = raw"([A-Z])[A-Z]+ (\d+)".r
def stockSummary(lstOfArt: Array[String], lstOfCat: Array[String]): String = {
val catMap =
lstOfArt.toStream.map(art =>
artRegex.findFirstMatchIn(art) match {
case Some(matches) => (matches.group(1), matches.group(2).toInt)
case None => throw new Exception(s"wrong art - $art")
})
.groupBy(x => x._1)
.map(x => {
val sum = x._2.map(x => x._2).sum
val cat = x._1
(cat, sum)
})
.withDefaultValue(0)
lstOfCat.toStream
.map(cat => {
val sum = catMap(cat)
s"($cat : $sum)"
})
.mkString(" - ")
}
он рабочий, но мне нужно знать как его улучшить, где тут подвохи, может я тут неоптимально чот делаю. И ещё фишки как упростить, укоротить и всё такое прочее. Не факт что я их заюзаю мне их просто надо знать, потому что я не шарю
суммоню всех известных скалистов
@vshapenko @DogeShibu @grishace @fvnever
Dr. Friedrich
Так. нужен код ревью от любителей скалировать.
примитивная задача с кодварс
есть массив строк вида
"ABCD 20", где первая буква - категория, дальше неизвестное кол-во рандомных букв и цифра - кол-во товара в категории.
Дан массив таких товаров и дан массив категорий.
Надо найти кол-во товаров по данным категориям.
Пример
товары = Array("ABART 20", "CDXEF 50", "BKWRK 25", "BTSQZ 89", "DRTYM 60")
категории = Array("A", "B", "C", "W")
результат
(A : 20) - (B : 114) - (C : 50) - (W : 0)
мой говнокод
val artRegex: Regex = raw"([A-Z])[A-Z]+ (\d+)".r
def stockSummary(lstOfArt: Array[String], lstOfCat: Array[String]): String = {
val catMap =
lstOfArt.toStream.map(art =>
artRegex.findFirstMatchIn(art) match {
case Some(matches) => (matches.group(1), matches.group(2).toInt)
case None => throw new Exception(s"wrong art - $art")
})
.groupBy(x => x._1)
.map(x => {
val sum = x._2.map(x => x._2).sum
val cat = x._1
(cat, sum)
})
.withDefaultValue(0)
lstOfCat.toStream
.map(cat => {
val sum = catMap(cat)
s"($cat : $sum)"
})
.mkString(" - ")
}
он рабочий, но мне нужно знать как его улучшить, где тут подвохи, может я тут неоптимально чот делаю. И ещё фишки как упростить, укоротить и всё такое прочее. Не факт что я их заюзаю мне их просто надо знать, потому что я не шарю
суммоню всех известных скалистов
@vshapenko @DogeShibu @grishace @fvnever
Собеседование проходишь чтоль?
Dr. Friedrich
Настолько не понравился walmart? :)
Ayrat
Ayrat
скорее всего щас пойду в скалу с головой
Vasily
Ну такое
Vasily
ZIO
Vasily
Код выглядит слишком понятным
Vasily
Надо упарываться в алгебры
Vasily
Тогда типа будет ок
Ayrat
Ну там предлагают гринфилд прожект. Громадный. И сразу хорошее место там. Но так как волмарт, то нужен JVM стак. В общем, я не долго колебался, щас буду скалировать
Vasily
Бабла насыпали?
Ayrat
Насыпят, да
Vasily
Пятнашку хоть дадут?
Vasily
Или ты пришел к успеху?
Ayrat
Тут сложно. Пока только обещания
Ayrat
Пока не обманывали, да и с чего бы
Dr. Friedrich
Так. нужен код ревью от любителей скалировать.
примитивная задача с кодварс
есть массив строк вида
"ABCD 20", где первая буква - категория, дальше неизвестное кол-во рандомных букв и цифра - кол-во товара в категории.
Дан массив таких товаров и дан массив категорий.
Надо найти кол-во товаров по данным категориям.
Пример
товары = Array("ABART 20", "CDXEF 50", "BKWRK 25", "BTSQZ 89", "DRTYM 60")
категории = Array("A", "B", "C", "W")
результат
(A : 20) - (B : 114) - (C : 50) - (W : 0)
мой говнокод
val artRegex: Regex = raw"([A-Z])[A-Z]+ (\d+)".r
def stockSummary(lstOfArt: Array[String], lstOfCat: Array[String]): String = {
val catMap =
lstOfArt.toStream.map(art =>
artRegex.findFirstMatchIn(art) match {
case Some(matches) => (matches.group(1), matches.group(2).toInt)
case None => throw new Exception(s"wrong art - $art")
})
.groupBy(x => x._1)
.map(x => {
val sum = x._2.map(x => x._2).sum
val cat = x._1
(cat, sum)
})
.withDefaultValue(0)
lstOfCat.toStream
.map(cat => {
val sum = catMap(cat)
s"($cat : $sum)"
})
.mkString(" - ")
}
он рабочий, но мне нужно знать как его улучшить, где тут подвохи, может я тут неоптимально чот делаю. И ещё фишки как упростить, укоротить и всё такое прочее. Не факт что я их заюзаю мне их просто надо знать, потому что я не шарю
суммоню всех известных скалистов
@vshapenko @DogeShibu @grishace @fvnever
Мне не нравится findFirstMatchIn: получается, ты пропускаешь невалидные описания типа ABAB 34ХЕР
Vasily
Ну предложат одно, во факту другое будет
Vasily
Кстати, в скале не option, а Either чаще находит применение
Vasily
Насколько я знаю
Dr. Friedrich
Dr. Friedrich
У наркомантов — да, пожалуй, чаще
Ayrat
Dr. Friedrich
У добрых людей чаще Option или Try.
Dr. Friedrich
val sum = x._2.map(x => x._2).sum
И вот ради этого ты забросил F#? :)
Vasily
Ну это он еще по HList не упарывался
Vasily
Судя по всему
Dr. Friedrich
В общем, мне тут не нравится x, лучше б поименовать аргумент лямбды, а то и деконструировать туплю прямо тут
Ayrat
Ayrat
настолько всё плохо
Ayrat
и да, деконстракт я не осилил
Ayrat
Очень хотел, но не осилил
Dr. Friedrich
настолько всё плохо
На самом деле не очень плохо, но ты его довольно дефективненько используешь :)
Ayrat
Не понял как
Ayrat
потому и спросил!
Ayrat
Dr. Friedrich
Вроде так? map { (_, d) => d }
Dr. Friedrich
Или там case обязательно дописать, вот навскидку не помню.
Ayrat
просто learnXinYminutes.com не даёт полного описания всего сахара скалы)
Vasily
Ваще, канеш
Vasily
Такие портянки пишутся с помощью for
Dr. Friedrich
Dr. Friedrich
findFirstMatchIn не всю строку целиком же матчит
Ayrat
Не кидаешь
artRegex.findFirstMatchIn(art) match {
case Some(matches) => (matches.group(1), matches.group(2).toInt)
case None => throw new Exception(s"wrong art - $art")
})
Dr. Friedrich
Он находит первое вхождение
Dr. Friedrich
Догадайся, что будет первым вхождением в "ADAD 123 хрен"?
Ayrat
ааа, ну эт надо регес поправить
Dr. Friedrich
Далее, x => x._1 можно сократить до _._1 :)
Ayrat
Dr. Friedrich
Ну и ещё последняя лямбда немного вербозно написана, я бы в одну строчку сделал
Ayrat
Ага, сделал.
Ayrat
Чот меня стринги добивают. Банальный доллар не могу вставить в raw string
Error:(3, 47) invalid escape character
val artRegex: Regex = raw"^([A-Z])[A-Z]+\s+(\d+)$".r
Ayrat
А, понял, надо два доллара
Ayrat
Так, второй заход:
val artRegex: Regex = raw"^([A-Z])[A-Z]+\s(\d+)$$".r
def stockSummary(lstOfArt: Array[String], lstOfCat: Array[String]): String = {
val catMap =
lstOfArt.toStream.map(art =>
artRegex.findFirstMatchIn(art) match {
case Some(matches) => (matches.group(1), matches.group(2).toInt)
case None => throw new Exception(s"wrong art - $art")
})
.groupBy(_._1)
.map(x => {
val sum = x._2.map(_._2).sum
val cat = x._1
(cat, sum)
})
.withDefaultValue(0)
lstOfCat.toStream
.map(cat => s"($cat : ${catMap(cat)})")
.mkString(" - ")
}
Ayrat
поправил регескп, теперь невалидное говно не пройдёт совсем. Но сахара маловато
Vasily
https://docs.scala-lang.org/tour/for-comprehensions.html