
Grigory
27.09.2017
11:27:42

A
27.09.2017
11:28:54
что ещё кроме tapl

Grigory
27.09.2017
12:02:28

A
27.09.2017
12:02:46
ну ссылками давай

Google

Grigory
27.09.2017
12:02:59
я отдыхаю гуглани библиографию
Но не будь я на отыдахе дал бы ссылки

KrivdaTheTriewe
27.09.2017
12:12:12

Oleg
27.09.2017
12:49:46
Посоны, а вот в sbt 1.0.1 пытаюсь сделать кросс паблиш,
при смене версии он пишет
[info] Setting Scala version to 2.11.11 on 0 projects.
[info] Switching Scala version on:
[info] Excluding projects:
и дальше перечисляет все мои модули
Почему sbt отказывается свитчить версию?
ясно https://github.com/sbt/sbt/pull/3526
короче, для истории, у кого будет такая же проблема, переписывайте с in ThisBuild локально на каждый проект

Alexey
27.09.2017
13:01:46
Или просто оставайтесь на 0.13.16

Daniel
27.09.2017
13:02:48
пр в 1.0.2 влит, мож там все ок уже (не считая коммента про костыль в решении)

Oleg
27.09.2017
13:06:14
а 1.0.2 уже есть?

Daniel
27.09.2017
13:07:48

Pavel ?
27.09.2017
13:16:42
Ребзи, в @jvmchat опрос по поводу оформления докладов jug.ru, потыкайте плз)

Google

folex
27.09.2017
13:52:46
Ни у кого на примете нету не слишком большого опенсорсного проекта, в котором можно посмотреть как умные люди совмещают StateT с Future в реальной жизни?
На эту тему почти ничего не гуглится как-то :(

Arthur
27.09.2017
13:54:31
разве он в качестве тайп параметра не принимает любую конструкцию с дженериком которой Future и является?

folex
27.09.2017
13:55:00
Да, принимает. Но как в итоге всё это скомпоновать в хороший юзабельный код — непонятно
Ну то есть дальше того факта что StateT принимает первым аргументом другой тип с дыркой я особо не уехал
Вот такую статью нашел, https://typelevel.org/blog/2016/10/26/edsls-part-2.html, но там маловато про это, и в целом сильно понятнее не стало

Nick
27.09.2017
13:57:02

Arthur
27.09.2017
14:02:44
кстати, statet понадобилось just for fun, или реальный кейс где это очень нужно?

folex
27.09.2017
14:05:19
Есть реальный кейс

Denis
27.09.2017
14:05:23
https://markkarpov.com/post/free-monad-considered-harmful.html

folex
27.09.2017
14:06:15
Пытаюсь написать удобный фреймворк для написания тестов, и там соответственно стейт надо протаскивать, плюс он приходит во фьючах. Решил попробовать через stateT.
Но что-то как-то...

KrivdaTheTriewe
27.09.2017
14:06:31

folex
27.09.2017
14:06:48
Сколько раз уже тыкался во всё это — ни разу не вышло что-то путное сделать.

Denis
27.09.2017
14:07:46
Напиши в терминах алгебры нужно, а потом уже запусти поверх StateT :)

folex
27.09.2017
14:08:24

Denis
27.09.2017
14:08:41
тебе нужна монада? Чтение и запись стейта, а так же выполнение Future[A] ?

folex
27.09.2017
14:08:52
у меня пока что совершенно нет понимания как это всё воедино склеить, с какой стороны подойти или типа того
Вот и хочу какие-нибудь проекты опенсорсные посмотреть что ли

Alexander
27.09.2017
14:09:14

Google

folex
27.09.2017
14:09:32

Denis
27.09.2017
14:09:38
trait MyAlgebra[S, F[_]] {
def getState: F[S]
def setState: F[Unit]
def liftFuture[A](fa: Future[A]): F[A]
}
это даст тебе возможность написать код не думая про StateT
и лишь потом в конце подумать один раз, реализовав эти три метода )

folex
27.09.2017
14:11:38
Да у меня нет понимания в какую сторону писать %))
мне эти подходы незнакомы, и я хочу им научиться

Denis
27.09.2017
14:11:57
Ща )
Я не знаю что скасти тупит но вот https://scastie.scala-lang.org/bb8M89aTRky9QWfk2wE1QQ
Смысл в том что вские StateT, EitherT и прочее нужно только at the end of the world. В конце, где то ближе к main

Alexey
27.09.2017
14:23:28

Denis
27.09.2017
14:24:40
Ну потому что так придумано было в хаскеле, ты описываешь все что нужно через тайпклассы, и в конце даешь инстанс для какого нибдь монструозного ReaderWriterStateT
Весь код описан относительно абстрактного F[_]
так как в скале тайпклассы это тоже объекты есть еще варианты как это сделать

Alexey
27.09.2017
14:26:37
Ну как бы StateT хорошо ложится на описание (сюрприз) логики, в которой есть состояние

Denis
27.09.2017
14:26:55
Ну да )
Только это уже конкретика ) для написания программы которая использует нечто с возможностью работы с состоянием StateT не нужен

Alexey
27.09.2017
14:28:08
Ну сервисы обмазывать StateT - это конечно плохо

Denis
27.09.2017
14:28:09
это открывает возможности композиции
если ты сразу пишешь относительно StateT и в друг где то другой стек - ты обречен обмазывать это все лифтами. В подходе с абстракным F[_] - ты это сделаешь один раз

Google

folex
27.09.2017
14:31:54
есть вопросы? )
По коду вроде всё понятно, но как это интегрировать к себе — нет %) Но я сейчас попробую!
и еще вернусь с вопросами :)

Denis
27.09.2017
14:32:13
давай
https://www.fpcomplete.com/blog/2017/06/readert-design-pattern

KrivdaTheTriewe
27.09.2017
16:08:51
ребята, а для чего вы Eval используете?

Oleg
27.09.2017
16:12:38
И для рекурсивной срани иногда
Типа вот есть у меня какие-то тайпклассы (описание типов для сваггера)
И они могут быть как-то хитро-рекурсивными
Тогда я во время вывода использую shapeless.Lazy, а в типах прописываю Eval

KrivdaTheTriewe
27.09.2017
16:16:00
Спасибо
было бы здорово это где-нибудь в продашн коде увидеть)

Oleg
27.09.2017
16:16:22
В продакшне у меня
Ну дефолтный котовий State он StateT[Eval
И вот представь себе в одном месте (не то, чтобы я гордился этим) он внутри макроса

KrivdaTheTriewe
27.09.2017
16:19:20
Весьма круто на самом деле, как мне кажется.
У меня пока нет мест , куда это подошло бы

Oleg
27.09.2017
16:20:35
на самом деле он просто заменяет lazy val
в куче мест

KrivdaTheTriewe
27.09.2017
16:21:02
ну основной же профит, там где рекурсивные алогоритмы

Google

KrivdaTheTriewe
27.09.2017
16:21:17
и нельзя @tailrec сделать , как я понял

Oleg
27.09.2017
16:21:54
Вместо того, что передавать что-то by name, и первой же строчкой этот параметр превращается в lazy val, можно просто передать Eval
Который будет и для нестексейф монад работать
из пьюрскрипта стащили

Nick
27.09.2017
16:30:50

Oleg
27.09.2017
16:39:44

folex
27.09.2017
16:43:38
Куда копать при ошибке
could not find implicit value for evidence parameter of type cats.Monad[scala.concurrent.Future] ?
Импорты:
import cats._
import cats.implicits._
import scala.concurrent.ExecutionContext.Implicits.global
Немного кода:
def test[F[_] : Monad](ops: ClientOps[F]) = ???
test(opsInstance: ClientOps[Future])

Nick
27.09.2017
16:45:40
Импорта инстанса нет?

folex
27.09.2017
16:46:08
import cats.implicits._ импортит по идее
AllInstances, а в нем вот это https://github.com/typelevel/cats/blob/master/core/src/main/scala/cats/instances/future.scala
пробовал инстанс руками подставлять, тоже ругается, вот так:
ambiguous implicit values:
[error] both method executionContext in trait AsyncTestSuite of type => scala.concurrent.ExecutionContext
[error] and lazy value global in object Implicits of type => scala.concurrent.ExecutionContext
[error] match expected type scala.concurrent.ExecutionContext
[error] test(futClientOps)(cats.implicits.catsStdInstancesForFuture)
[error] ^

Mikhail
27.09.2017
16:48:00
Удали импорт EC

folex
27.09.2017
16:48:04
Подставляю руками вот так:
test(opsInstance: ClientOps[Future])(cats.implicits.catsStdInstancesForFuture)

Mikhail
27.09.2017
16:48:23
У тебя и так есть в скоуп контекст

folex
27.09.2017
16:48:44
оу, вот это было глупо. Спасибо!

KrivdaTheTriewe
27.09.2017
16:49:42
а через корневой билд.сбт можно как-то добавлять компилер плагины (парадайз) не создавая отдельный build.sbt в поддиректории подпроекта ?
Ответ простой( также как и всё остальное, в сеттингсах подпроекта addCompilerPlugin(
"org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full),)