
Wystan
17.03.2018
11:49:10

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

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

Nick
17.03.2018
21:22:57

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

Vic
17.03.2018
22:17:17

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

Vic
17.03.2018
22:19:06
открыл инстансы в эффектах для клейсли. но идею не понял
имелось в виду, что вместо liftIO с помощью них можно с лифтить в любую эффектную F[_]?

Google

Oleg
18.03.2018
06:44:44

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. Точнее, я не разобрался с эффектс достаточно, чтобы правильно в них уметь.

Oleg
18.03.2018
08:01:53

Grigory
18.03.2018
08:02:55

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

Oleg
18.03.2018
08:41:37

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
Сделал по совету 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

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

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

Daniel
18.03.2018
11:43:08

hohserg
18.03.2018
11:43:28

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

Google

Vic
18.03.2018
12:55:46

Oleg
18.03.2018
14:22:08

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:30

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 мрачновато