Size: a a a

Scala User Group

2021 August 29

E

Elijah in Scala User Group
интересный момент, спасибо
источник

SK

Sergey Kucherenko in Scala User Group
++, scalaz.Tree удобное было, cojoin и готово
источник

SK

Sergey Kucherenko in Scala User Group
но да, дерево зипперов это там наверняка оверхед давало занятный
источник
2021 August 30

D

Dmitry in Scala User Group
Привет, а подскажите, плз, как понять (желательно в REPL без мощи IDE), какой implicit conversion срабатывает в выражении?

Например, 1.max , который берется из RichInt. Хочу уметь понимать, что max прилетел из RichInt
Или, функция требует  тип A, я подсовываю тип B, все работает. Почему оно сработало?
источник

AS

Artem Sokolov in Scala User Group
звучит как будто нужно юзать презентацию очередной стадии компиляции в scalac
источник

BA

Boris Azanov in Scala User Group
по идее в IDEA как раз есть настройка во вкладке View -> Show Implicit Hints
источник

АМ

Азамат Макарчук... in Scala User Group
источник

BA

Boris Azanov in Scala User Group
вот еще до кучи есть ответ как компилятор резолвит имплиситы
https://stackoverflow.com/a/5598107/6770614
источник

D

Dmitry in Scala User Group
Во, кокнретно эта штука у меня не запахала, пишет


scala> implicitly[Int => { def min(i: Int): Any }]
                ^
      error: No implicit view available from Int => AnyRef{def min(i: Int): Any}.


Ну то есть я допускаю, что надо как-то типы пофиксать, но для этого надо точно знать сигнатуру, а чтобы значть сигнатуру, надо значть что оно из RichInt))
источник

D

Dmitry in Scala User Group
О, вот такое проканало


scala> reify(1.max(3))
val res15: reflect.runtime.universe.Expr[Int] = Expr[Int](Predef.intWrapper(1).max(3))
источник

BA

Boris Azanov in Scala User Group
а вообще, вот тут в комменте заметили, что сигнатуру надо поменять на др, так как та, что в ответе малость устарела:
https://stackoverflow.com/questions/3855595/what-is-the-scala-identifier-implicitly/3859512#comment98822553_3859512
источник

S

Simon in Scala User Group
scala> import reflect.runtime.universe._
import reflect.runtime.universe._

scala> show { reify { 1 max 2 } }
val res1: String = Expr[Int](Predef.intWrapper(1).max(2))
источник

BA

Boris Azanov in Scala User Group
вместо
implicitly[Int => { def min(i: Int): Any }] теперь
implicitly[Int => AnyVal{ def min(i: Int): Int }]
источник

D

Dmitry in Scala User Group
Ну это проблема курицы и яйца же
источник

S

Simon in Scala User Group
таб-таб:
scala> Predef.intWrapper(1).max
override def max(that: Int): Int
источник

D

Dmitry in Scala User Group
спасибо всем за ссылки и ответы)
источник

BA

Boris Azanov in Scala User Group
нууу, по идее вы можете и `AnyVal` заменить на `Any`, результат не поменяется. Понять это можно так, когда пишешь:

implicitly[Int => Any { def max(i: Int): Any }]

это значит: достань мне из неявных функций такую, которая принимает Int и возвращает объект типа Any который имеет ф-цию max(принимает Int: возвращает Any). По сути мы не обязаны тут знать, что именно будет скрываться под Any, нам достаточно знать что есть функция max и что она принимает какой-то известный нам тип (Int). Нам вернется функция - по сути неявного преобразования. Вызвав эту функцию на любом значении Int, мы получим объект типа Any с функцией max, ну и вызвав .getClass у этого объекта получим конкретную реализацию из текущего скоупа неявных преобразований - RichInt. Как-то так:


scala> implicitly[Int => Any{ def min(i: Int): Any }]
val res26: Int => Any{def min(i: Int): Any} = $Lambda$1290/681463887@42dc92de

scala> res26(5)
val res27: Any{def min(i: Int): Any} = 5

scala> .getClass
val res28: Class[_] = class scala.runtime.RichInt
источник

D

Dmitry in Scala User Group
Врубил, спасибо большое за ликбез)
источник
2021 August 31

СВ

Сергей Вьюн... in Scala User Group
,()[] - служебные символы, нельзя передавать в поле id
https://scastie.scala-lang.org/tIMmmj7ATCylQx9KAWgPVw
источник

Д

Денис in Scala User Group
всем привет 👋

как можно заставить работать такую конструкцию?
источник