Conversione implicita per la sottotipizzazione della funzione

0

Le lingue con le coercizioni ( ie conversioni di tipo implicito ) consentono di esprimere cose del genere (indipendentemente da qualsiasi sintassi):

f : int32 → int32 = λx.x+x
a : int16 = 42
b : int64 = f(a)

Dove le conversioni di tipo non sono esplicitamente indicate nel codice. Il controllo del tipo si basa su: int16 <: int32 <: int64 . Esiste un linguaggio di programmazione in cui si estende a sottotipi di tipi di funzione ? Permettere di scrivere:

g : int16 → int64 = f
    
posta cuihtlauac 24.05.2018 - 14:24
fonte

1 risposta

2

Stai confondendo le coercizioni con la sottotitolazione.

  • Alcune coercizioni come upcasting sono gratuite e sono collegate a sottotitoli. Hanno effetto solo durante il controllo dei tipi e hanno la stessa rappresentazione runtime. Per esempio. tutti gli oggetti potrebbero avere la stessa rappresentazione (un puntatore).

    es. in Java, un metodo Derived f(Base x) è un sottotipo di Base g(Derived x) se Derived è un sottotipo di Base .

  • Altre coercizioni sono conversioni implicite che hanno qualche effetto di runtime, ad es. convertire un int in un doppio. Non solo è necessario emettere un codice per questo, ma i tipi possono avere una rappresentazione diversa (ad esempio, byte o parola). Se i dati devono essere modificati, l'ABI di due funzioni non è compatibile.

    es. in Java, una funzione int f(double x) non è un sottotipo di double g(int x) in quanto le firme di funzione sono fondamentalmente diverse: i tipi primitivi come int non sono oggetti che hanno una relazione di sottotipizzazione, ma tipi di valore.

    In alcuni casi, f e g potrebbero essere compatibili con l'origine: double y = f(42) può anche usare g in Java. Ma a seconda della funzione chiamata, verrà generato un codice diverso nel sito di chiamata. Il chiamante e non la funzione esegue la conversione di questi valori.

    I modelli C ++ sono un po 'insoliti perché essenzialmente eseguono la generazione di codice simile a una macro. Quindi sarebbe possibile scrivere una funzione di template C ++ t che potrebbe occuparsi di f o g finché tali funzioni sono compatibili con l'origine. Ma t(f) e t(g) chiamano funzioni completamente diverse t<...>(...) per quanto riguarda la lingua.

risposta data 24.05.2018 - 14:59
fonte