密封接口与代数类型:构建无副作用的 JSON 解析器
利用密封接口模拟 Haskell 的 ADT,并结合 when 穷尽检查实现一个类型安全的 JSON 解析器。 · 难度:入门 · +10XP
密封接口与代数类型:构建无副作用的 JSON 解析器
密封接口 (sealed interface) 相比密封类允许更多灵活性,因为一个类可以实现多个密封接口。本教程利用密封接口表示 JSON 的四种基本类型(对象、数组、字符串、数字、布尔、Null),然后编写一个纯函数解析器,通过 when 穷尽分支保证所有情况都被处理。进一步将解析结果封装为 Result
sealed interface JsonElement {
data class JsonObject(val map: Map) : JsonElement
data class JsonArray(val list: List) : JsonElement
data class JsonString(val value: String) : JsonElement
data class JsonNumber(val value: Double) : JsonElement
object JsonNull : JsonElement
}
fun JsonElement.stringify(): String = when(this) {
is JsonElement.JsonObject -> "{...}"
is JsonElement.JsonArray -> "[...]"
is JsonElement.JsonString -> "\"$value\""
is JsonElement.JsonNumber -> value.toString()
JsonElement.JsonNull -> "null"
// 密封接口保证无需 else 分支
}