refined icon indicating copy to clipboard operation
refined copied to clipboard

Inference rules are not working for Interval types

Open ChernikovP opened this issue 5 years ago • 0 comments

While getting familiar with refined (version 0.9.4) I was excited by ability to easily convert between refined types:

scala> val a: Int Refined Greater[W.`5`.T] = 10
a: Int Refined Greater[Int(5)] = 10

scala> val b: Int Refined Greater[W.`4`.T] = a
b: Int Refined Greater[Int(4)] = 10

but once I tried slightly more complex type, I faced compiler error:

scala> val i: Int Refined Interval.Closed[W.`5`.T, W.`15`.T] = 10
i: eu.timepit.refined.api.Refined[Int,eu.timepit.refined.numeric.Interval.Closed[Int(5),Int(15)]] = 10

// I expected  this to work as [5, 15] is inside `[0, 20], but ...
scala> val j: Int Refined Interval.Closed[W.`0`.T, W.`20`.T] = i
<console>:22: error: type mismatch;
 found   : eu.timepit.refined.api.Refined[Int,eu.timepit.refined.numeric.Interval.Closed[Int(5),Int(15)]]
    (which expands to)  eu.timepit.refined.api.Refined[Int,eu.timepit.refined.boolean.And[eu.timepit.refined.boolean.Not[eu.timepit.refined.numeric.Less[Int(5)]],eu.timepit.refined.boolean.Not[eu.timepit.refined.numeric.Greater[Int(15)]]]]
 required: eu.timepit.refined.api.Refined[Int,eu.timepit.refined.numeric.Interval.Closed[Int(0),Int(20)]]
    (which expands to)  eu.timepit.refined.api.Refined[Int,eu.timepit.refined.boolean.And[eu.timepit.refined.boolean.Not[eu.timepit.refined.numeric.Less[Int(0)]],eu.timepit.refined.boolean.Not[eu.timepit.refined.numeric.Greater[Int(20)]]]]
       val j: Int Refined Interval.Closed[W.`0`.T, W.`20`.T] = i

ChernikovP avatar Mar 11 '19 14:03 ChernikovP