Christian Maus
01/12/2020, 6:18 PMsealed class Expression<A>
data class Num(val value: Int) : Expression<Int>()
data class Bool(val value: Boolean) : Expression<Boolean>()
data class Add(val a: Expression<Int>, val b: Expression<Int>) : Expression<Int>()
data class Equals<A>(val first: Expression<A>, val second: Expression<A>) : Expression<Boolean>()
fun <A> eval(e: Expression<A>): A = when (e) {
is Num -> e.value
is Bool -> e.value
is Add -> (eval(e.a) + eval(e.b))
is Equals<*> -> eval(e.first) == eval(e.second)
} as A
fun main(args: Array<String>) {
val exp = Equals(
Equals(
Num(3),
Add(
Num(1),
Num(2)
)
),
Bool(true)
)
println(eval(exp))
}
Is there a way to get rid of the cast to A?Dominaezzz
01/12/2020, 6:26 PMraulraja
01/12/2020, 9:00 PMelizarov
01/13/2020, 8:44 AMvalue
of Expression<A>
has type A
(otherwise, there’s no way to explain this to compiler, thus the need to use unchecked casts).
sealed class Expression<A> {
abstract val value: A
}
Full code: https://gist.github.com/elizarov/b5400f827616090811ebb348acd4c426dmitriy.novozhilov
01/13/2020, 11:10 AM