@scala_ru

Страница 1350 из 1499
Vic
17.03.2018
19:11:33
скинь кот
https://scastie.scala-lang.org/KXHM08KiTIy6nDqLQhJ2Rw

Nick
17.03.2018
19:12:13
Ого, mtl

Google
Vic
17.03.2018
19:13:20
кароч, двумя способами одно и тоже. без трансформеров норм. на трансформерах страшно. на трансформерах без МТЛ вообще глаза кровят, если каждый лифт параметризовать. но с мтл и тайпалиасами еще более менее читаемо

внимание вопрос: так вообще пишут на скалке?

Nick
17.03.2018
19:21:03
Пишут пишут

Denis
17.03.2018
21:12:42
Короче откладывай конкретный F[_] до последнего

Vic
17.03.2018
21:20:11
Так ты офигеешь, юзай таглес и в самос конце если надо уже инстанциируй в стек трансформеров
Попробую то же самое на таглесс сделать. Откладывай конкретный F[_] - имеется в виду абстрагироваться от IO?

Denis
17.03.2018
21:20:58
Ну да не только йо может и ReaderT какой понадобится

yaroslav
17.03.2018
22:11:23
внимание вопрос: так вообще пишут на скалке?
я так делаю сейчас добавили инстансы ReaderT в cats-effect в Reader ложу контекст запроса и использовать тайп-клас типа trait ContextOps[F[_]]{ def context:F[RequestContex] } что-бы писать типа def foo[F:ContextOps]

yaroslav
17.03.2018
22:18:19
нет =( нда

Vic
17.03.2018
22:19:06
открыл инстансы в эффектах для клейсли. но идею не понял

имелось в виду, что вместо liftIO с помощью них можно с лифтить в любую эффектную F[_]?

Google
Nick
18.03.2018
06:59:02
хороший вопрос https://stackoverflow.com/questions/49070901/mocking-a-method-which-returns-an-fs2-stream#

Dim
18.03.2018
07:01:44
Други, скажите стоит или не стоит.

BSONObjectID.parse(stringBsonId) match { case Success(bSONObjectID) => //тут запрос в базе, результат Future[T] case Failure(e) => Future.failed(e) }

Есть много вот такого кода (это reactivemongo)

Oleg
18.03.2018
07:02:22
Dim
18.03.2018
07:04:16
или везде просто юзать конструкцию выше для получения bsonObjectId

Vic
18.03.2018
07:08:57
какой инстанс ты имеешь в виду?
Там много инстансов, для всех трансформеров есть инстансы в каждом тайпклассе: Sync, Async, Effect, ... Я не понял правда, идею @yaroslav_hryniuk. Точнее, я не разобрался с эффектс достаточно, чтобы правильно в них уметь.

Grigory
18.03.2018
08:02:55
или везде просто юзать конструкцию выше для получения bsonObjectId
Если можно абстрагировать и твою паршл фунуцию куда то вынести - так и надо делать; копипаста понятности коду не добавит

Dim
18.03.2018
08:07:50
implicit def stringToFutureBsonObjectId(stringBsonObjectId: String): Future[BSONObjectID] = { BSONObjectID.parse(stringBsonObjectId).map(bsonObjectId => Future.successful(bsonObjectId)) match { case Success(futureBsonObjectId) => futureBsonObjectId case Failure(e) => Future.failed(e) } }

вот такой имплицит получился, только заюзать не знаю как, там у map получается надо будет указывать тип.

Просто не хочется постоянно эту портянку с BSONObjectID.parse повторять

Oleg
18.03.2018
08:22:59
https://scastie.scala-lang.org/KXHM08KiTIy6nDqLQhJ2Rw
ну пока от компа далеко, но есть несколько идей 1. Промежуточные слои не обязательно писать алиасами, можно юзать kind-projector 2. EithetT[, Unit,] выглядит как минимум странно. заменим на OptionT, но возможно ли, что там можно просто IO оставить. 3. Скалка ужасна в выводе тайп-параметров по предполагаемому результату, но не по параметрам, поэтому А) можно где-то выше просто саммонить val askInst = ApplicativeAsk[M, R] val stateInt = MonadState[M, S] import askInst.{ask, local} import stateInst.{put, get, modify} Б) Юзать синтаксис только в полиморфных функциях, типа def foo[F[_] : MonadState[?[_], S] : ApplicativeAsk[?[_], R]] Тогда, если код хорошо отделён, в теле функции у компилятора только один инстанс будет известен, и это часто упростит задачу, а когда не справится написать [F] тоже не очень сложно

Но, конечно хаскелёвого комфорта ни при каком подходе ты не получишь.

Vic
18.03.2018
08:38:55
ну пока от компа далеко, но есть несколько идей 1. Промежуточные слои не обязательно писать алиасами, можно юзать kind-projector 2. EithetT[, Unit,] выглядит как минимум странно. заменим на OptionT, но возможно ли, что там можно просто IO оставить. 3. Скалка ужасна в выводе тайп-параметров по предполагаемому результату, но не по параметрам, поэтому А) можно где-то выше просто саммонить val askInst = ApplicativeAsk[M, R] val stateInt = MonadState[M, S] import askInst.{ask, local} import stateInst.{put, get, modify} Б) Юзать синтаксис только в полиморфных функциях, типа def foo[F[_] : MonadState[?[_], S] : ApplicativeAsk[?[_], R]] Тогда, если код хорошо отделён, в теле функции у компилятора только один инстанс будет известен, и это часто упростит задачу, а когда не справится написать [F] тоже не очень сложно
1. я сначала через кайнд прожекторы написал - очень многословно. тайпалиасы позволили вложенность свести к одному алиасу. 2. Either продиктован сигнатурой tailRecM. Да, можно было и опшен сделать, а потом трансформирвать его в either снаружи. 3. попробую варианты —------------------------------ отдельный вопрос про IO. я заменил IO на F[_] : Effect в сигнатуре возвращаемого типа. т.е. я при запуске могу использовать вместо IO - monix.Task. но я не смог вынести IO из класса консольи ввода-вывода - там остался IO и liftIO из него в обвзяку над F[_].

можно ли вообще от IO отвязаться?

Google
Vic
18.03.2018
08:44:32
Немного не то. У меня сейчас команда - это IO[String]. Я могу это лифтнуть в любой трансформер. Если я заменю на F[String] - как лифтнуть в ридерТ?

Oleg
18.03.2018
08:47:25
Ну и непонятно зачем тебе IO для tailRecM, он есть у любой монады

Vic
18.03.2018
09:10:20
Ну и непонятно зачем тебе IO для tailRecM, он есть у любой монады
tailRecM мне для лупа в REPL - читаю консоль и меняю стейт пока не получена команда выхода. к IO это не привязано. в гист сейчас выложу

Сделал по совету 3-А. Убрал синтаксические конверсии, явно вынес все инстансы. Читаемость фора улучшилась.

Теперь второй вопрос: как перейти от Console[IO] к Console[F]

получилось только вот так: def liftF[A](x: F[A]) = ReaderT.liftF[StateT[EitherT[F, Unit, ?], ProcessPool, ?], Console[F], A](StateT.liftF[EitherT[F, Unit, ?], ProcessPool, A](EitherT.liftF[F, Unit, A](x)))

MTL должен предоставлять свертку для лифтинга, но что-то я не вижу как это делается

hohserg
18.03.2018
11:22:09
Всем привет. Почему так нельзя писать?

implicit private def tuple2Vec[F:Numeric](t:(F ,F ,F )): Vec3d = { //это import implicitly[Numeric[F]]._ new Vec3d(t._1.toDouble,t._2.toDouble,t._3.toDouble) }

Alexey
18.03.2018
11:23:23
А зачем делать импорт из Numeric?

hohserg
18.03.2018
11:23:55
Ну вот так можно:

implicit private def tuple2Vec[F:Numeric](t:(F ,F ,F )): Vec3d = { val n=implicitly[Numeric[F]] import n._ new Vec3d(t._1.toDouble,t._2.toDouble,t._3.toDouble) }

А без переменной нельзя

А в качестве F толкать любой численный тип

Daniel
18.03.2018
11:31:00
Можно вот так: https://gist.github.com/danslapman/10429c00762c5d92388c5cc95fa094d1/0f861d8c73009aa5e39483e63e9c5a94f88534c6

Vic
18.03.2018
11:34:27
не вижу, про какую строчку ты говоришь. Может, в гист и по номеру?
Самое краткое что придумал по лифтингу: val EFL = ApplicativeLayer[Ei, F] val SEL = ApplicativeLayer[St, Ei] val RSL = ApplicativeLayer[Re, St] def liftF[A](x: F[A]) = RSL.layer(SEL.layer(EFL.layer(x))) где Ei, St, Re - это мои тайпалиасы

Google
Oleg
18.03.2018
11:34:59
Не. Лэйеры вручную не надо делать

Можешь скинуть последнюю версию цельного кода сейчас

Vic
18.03.2018
11:35:30
сек

в гист или скасти?

Admin
ERROR: S client not available

Oleg
18.03.2018
11:38:34
лучше гист

Alexey
18.03.2018
11:39:04
hohserg
18.03.2018
11:39:31
А присваивать можно и из нестабильной?

Т.е. компиль не может понять, что вернет implicitly?

Vic
18.03.2018
11:41:34
лучше гист
https://gist.github.com/anonymous/16e59919f2b2ae2ef6fb0dfe18ff7e90

Alexey
18.03.2018
11:42:15
Т.е. компиль не может понять, что вернет implicitly?
Может, просто ему надо потом из чего то дергать эти функции, а так как он никуда не присвоен, то дергать нечего

hohserg
18.03.2018
11:43:03
Ну метод же возвращает значение, значит, есть откуда вызвать

Daniel
18.03.2018
11:43:08
Т.е. компиль не может понять, что вернет implicitly?
Посмотри мой гист, тебе не нужно implicitly

Daniel
18.03.2018
11:43:40
Можно вот так: https://gist.github.com/danslapman/10429c00762c5d92388c5cc95fa094d1/0f861d8c73009aa5e39483e63e9c5a94f88534c6

Вот это

hohserg
18.03.2018
11:44:19
Упс, почему-то пропустил это сообщение раньше

Спасибо, работает)

implicit private def tuple2Vec[F:Numeric](t:(F ,F ,F )): Vec3d = { import Numeric.Implicits._ new Vec3d(t._1.toDouble,t._2.toDouble,t._3.toDouble) }

Oleg
18.03.2018
12:44:35
https://gist.github.com/anonymous/16e59919f2b2ae2ef6fb0dfe18ff7e90
ну что-то порефакторилось https://gist.github.com/Odomontois/aacb028be932ced972b8adbea2626008

Google
Vic
18.03.2018
12:55:46
ну что-то порефакторилось https://gist.github.com/Odomontois/aacb028be932ced972b8adbea2626008
правда при упрощении и выкидывании EitherT пропала fail-fast семантика. если после continue будут еще байнды, они выполнятся при Quit

Vic
18.03.2018
14:29:14
апдейтнул гист
Ага. Спасибо. Получилось проще, чем мой вариант. Прежде всего за счет снятия лишнего слоя ReaderT. Он тут действительно не к месту. Ну и с консолью я разобрался, сначала перемудрил

Andrey
19.03.2018
08:36:20
Задача: есть HTML, надо из него сделать PDF. НУ или как вариант сразу сделать PDF... Есть ли какие-то нормальные либы? Такие что бы манада на монаде и функтором погоняла...

Vladimir
19.03.2018
08:37:27
Это будут джавайные либы, монады надо самому натягивать

Denis
19.03.2018
08:37:46
Java[A]

Andrey
19.03.2018
08:38:56
НУ про монады это я так... мало было надежды... Хотя бы просто что-то нормальное...

Andrey
19.03.2018
08:39:59
iText... okay

Vladimir
19.03.2018
08:40:50
wkhtmltopdf, но там есть такое себе

Basil
19.03.2018
08:40:54
рабочих вариантов грубо два: flying saucer и wkhtmltopdf

второй лучше понимает html, а первый лучше умеет pdf, в смысле всякую paged media специфику, типа разрывов страниц

Vladimir
19.03.2018
08:45:58
дыа, с форматированием нескольких страниц в wkhtml мрачновато

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