Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

scala3 questions #291

Open
cquiroz opened this issue Jun 4, 2022 · 5 comments
Open

scala3 questions #291

cquiroz opened this issue Jun 4, 2022 · 5 comments

Comments

@cquiroz
Copy link

cquiroz commented Jun 4, 2022

I did a first attempt trying to use coulomb in scala 3. I got quite a bit of progress on a relatively simple library that uses coulomb but I have some errors I can't solve, having tried several imports.

How could I get this work?

[error] -- Error: /Users/carlos.quiroz/code/noirlab/lucuma-itc/modules/itc/src/main/scala/lucuma/itc/ItcImpl.scala:150:40 
[error] 150 |                  ((expTime - oldExpTime) > 1.withUnit[Second] || (oldExpTime - expTime) > 1
[error]     |                                        ^
[error]     |Subtraction not defined in scope for Quantity[BigDecimal, coulomb.units.si.Second] and Quantity[BigDecimal, coulomb.units.si.Second]
[error]     |
[error]     |One of the following imports might make progress towards fixing the problem:
[error]     |
[error]     |  import coulomb.policy.spire.standard.ctx_sub_1V1U
[error]     |  import coulomb.policy.spire.standard.ctx_sub_1V2U
[error]     |  import coulomb.policy.spire.standard.ctx_sub_2V1U
[error]     |  import coulomb.policy.spire.standard.ctx_sub_2V2U
[error]     |  import coulomb.policy.spire.strict.ctx_sub_1V1U
[error]     |  import coulomb.policy.spire.strict.ctx_sub_1V2U
[error]     |  import coulomb.policy.spire.strict.ctx_sub_2V1U
[error]     |  import coulomb.policy.spire.strict.ctx_sub_2V2U
[error]     |  import coulomb.policy.standard.ctx_sub_1V1U
[error]     |  import coulomb.policy.standard.ctx_sub_1V2U

I'm importing

import coulomb.policy.spire.standard.`given`
import coulomb.ops.algebra.spire.all.*

I have a few similar errors for division and multipaction. I guess I'm missing an algebra?

Any guidance would be appreciated

@erikerlandson
Copy link
Owner

That second one should be import coulomb.ops.algebra.spire.all.given
Until I write some proper tutorials, the best reference on what imports should work is probably the unit tests:
https://github.com/erikerlandson/coulomb/blob/scala3/spire/src/test/scala/coulomb/quantity.scala#L20

@cquiroz
Copy link
Author

cquiroz commented Jun 5, 2022

Maybe it is related to Unitless. Here is a minimal reproduction

import coulomb.*
import coulomb.syntax.*

import algebra.instances.all.given
import coulomb.ops.algebra.spire.all.given

import coulomb.policy.spire.standard.given
import coulomb.units.si.*
import coulomb.units.si.given
import scala.math._

object ItcImpl2 {
  val expTime: Quantity[BigDecimal, Second]   = ???
  val nExp                                    = 1
  val totalTime: Quantity[BigDecimal, Second] =
    expTime * nExp.withUnit[Unitless]
}

With error:

[error] -- Error: /Users/carlos.quiroz/code/noirlab/lucuma-itc/modules/itc/src/main/scala/lucuma/itc/ItcImpl2.scala:22:37 
[error] 22 |    expTime * nExp.withUnit[Unitless]
[error]    |                                     ^
[error]    |Multiplication not defined in scope for Quantity[BigDecimal, coulomb.units.si.Second] and Quantity[Int, (1 : Int)]
[error]    |
[error]    |One of the following imports might make progress towards fixing the problem:
[error]    |
[error]    |  import coulomb.policy.spire.standard.ctx_mul_1V2U
[error]    |  import coulomb.policy.spire.standard.ctx_mul_2V2U
[error]    |  import coulomb.policy.spire.strict.ctx_mul_1V2U
[error]    |  import coulomb.policy.spire.strict.ctx_mul_2V2U
[error]    |  import coulomb.policy.standard.ctx_mul_1V2U
[error]    |  import coulomb.policy.standard.ctx_mul_2V2U
[error]    |  import coulomb.policy.strict.ctx_mul_1V2U
[error]    |  import coulomb.policy.strict.ctx_mul_2V2U
[error]    |  import shapeless.~?>.idKeyWitness
[error]    |  import shapeless.~?>.idValueWitness
[error]   

@erikerlandson
Copy link
Owner

@cquiroz I am failing to reproduce that error. I wrote this and it compiled with no errors, although it threw a bunch of warnings about Unitless being deprecated

object repro {
    import coulomb.*
    import coulomb.syntax.*

    import algebra.instances.all.given
    import coulomb.ops.algebra.spire.all.given

    import coulomb.policy.spire.standard.given
    import coulomb.units.si.*
    import coulomb.units.si.given
    import scala.math._

    object ItcImpl2 {
        val expTime: Quantity[BigDecimal, Second]   = BigDecimal(1).withUnit[Second]
        val nExp                                    = 1
        val totalTime: Quantity[BigDecimal, Second] =
          expTime * nExp.withUnit[Unitless]
    }
}

@cquiroz
Copy link
Author

cquiroz commented Jun 6, 2022

Thanks turns out it works when doing imports as import coulomb._
This seems to be down to a compiler issue when using a kindProjector flag

@erikerlandson
Copy link
Owner

@cquiroz thanks for the pointer! I will try to keep that in mind

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants