Domanda

Se i dati sono semplici e gli oggetti sono complessi, Sono curioso di sapere se ci sono lingue tipizzate staticamente esistenti che sarebbero in grado di aumentare (?) Un tipo di mappa in un tipo con campi garantiti. Mi rendo conto che in fase di esecuzione, in qualsiasi lingua, questo tipo di assegno è piuttosto fattibile. Ma in teoria credo anche che ciò dovrebbe essere possibile verificare con un compilatore. Fare tutto di seguito in Java, sarebbe un'esplosione di interfacce (hascomplete, Hastitle, Hastitleandcomplete)

Quindi qualcuno l'ha fatto? In caso contrario, come mai? In tal caso, come è stato implementato?

Ciò ti consentirebbe di leggere i dati ma quindi manipolarli con almeno un certo tipo di sicurezza:

// User input is often simply converted to a Map
function parse(json) -> Map {...} 

// result still has all user input fields, 
// but this would be a runtime exception 
// if specified fields are missing
function cast(Map, Map<fields...>) -> Map<fields...> { ... }

input = "{title:'do it', complete: false, rank: 5, subtitle: 'now'}"

// Would throw class cast exception if complete or title were missing
todo = cast(parse(input), Map<title:str, complete:bool>)     

// Runtime introspection
todo instanceOf Map -> true
todo instanceOf Map<title:str, complete:bool> -> true
todo instanceOf Map<title:str> -> true
todo instanceOf Map<complete:bool> -> true
todo instanceOf Map<complete:date> -> false
todo instanceOf Map<rank:int> -> false because cast() did not specify rank
todo instanceOf Map<title:str, complete:bool, author:str> -> false 

// Typed methods based on map with certain fields
function capitalize_title(Map<title:str>) {...}
function finish_task(Map<complete:bool>) {...}
function finish_and_rename(Map<title:str, complete:bool>, newTitle) {...}
function increase_rank(Map<rank:int>) {...}

// Static Check compile pass
todo = capitalize_title(todo)
todo = finish_task(todo)
todo = finish_and_rename(todo, "[complete]")

// Static Check Compile Fail because cast() did not specify rank
increase_rank(todo)

// Methods could return a type with added (or removed) fields
function add_uuid(Map) -> Map<+id:int> {...}
todo_with_id = add_uuid(todo)
todo_with_id instanceOf Map<title:str, complete:bool, id:int> // true

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
scroll top