Last active
February 6, 2021 01:01
-
-
Save matfournier/8b943bddcd6a1552f5c6821aa81abd78 to your computer and use it in GitHub Desktop.
gadthelp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
sealed trait Scenario[A, B] | |
object Scenario { | |
// later pattern matching let's me do GADT stuff in pattern matches fine | |
case object A extends Scenario[AA, AA1] | |
case object B extends Scenario[BB, BB1] | |
// but how to get into this domain from the outside is the problem...(this doesn't compile obviously) | |
def from[A, B](s: String): Scenario[A, B] = s match { | |
case "a" => A | |
case "b" => B | |
} | |
} | |
// later usage using the GADT in a pattern match | |
object Generator { | |
def from[A, B](scenario: Scenario[A, B]): Box[A, B] = scenario match { | |
case A => constantA // returns some Box[AA, AA1] | |
case B => constantB // returns some Box[BB, BB1] | |
} | |
} | |
// later later usage | |
// relies on the answer of Box[A, B] to lookup implicits for A, B. | |
// I can use an existential type to parse the string and return Scenario[_,_] later | |
// but then I lose the fact it's AA, AA1 or BB, BB1 later | |
// and a bunch of implicit lookups fail because it can't find implicits for | |
// _$1, and _$2 | |
/* | |
e.g. I have some | |
for { | |
.. some stuff | |
scenario = Scenario.from(someString) // will be Either[Throwable, Scenario[_, _]].liftTo[IO] or whatever later | |
generator = Generator.from(scenario) | |
thing <- doThing(generator) | |
... | |
} yield ... | |
where doThing is | |
def doThing[A : Codec, B: Codec](box: Box[A, B], ...) { | |
} | |
but if I type the initial parsing as a existential type | |
I get the issue | |
could not find implicit Codec[Box[_$1,_$2]]]; ensure no imports are missing | |
but there are definitely codecs that can be derived for Box[AA, AA1] and Box[BB, BB1] | |
it just is confused as I've lost the typing, even though I should be getting it back | |
on the pattern match in the gadt to go from Scenario -> Box[A, B] | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment