2010-10-20 9 views
11

Eventuali duplicati:
How to deal with Python ~ static typing?Perché non è possibile inferire python come scala?

Sono fondamentalmente un programmatore Java con poca conoscenza di python.I piace molto la sintassi di Python e la facilità con cui un programmatore è in grado di esprimere la sua idea, ma anche io sono consapevole che python è tipizzato dinamicamente e quindi non è veloce come Java. La mia domanda è perché non può inferire tipo python come lingue come scala?

+4

Scala ha tipi. Basta non doverli digitare tutto il tempo (gioco di parole). – Thilo

+1

Non penso che sia un duplicato. L'altra domanda riguarda più "perché Python non ha bisogno di digitare affatto". – Thilo

+1

@Emil: Perché tutti vogliono che tutto il linguaggio di programmazione sia uguale? – pyfunc

risposta

24

Non è che Python non possa, ma non è così. La differenza sta nei sistemi di tipi che i designer delle lingue scelgono di seguire.

Python utilizza la digitazione anatra e ha digitato oggetti ma nomi di variabili non tipizzate. I vincoli di tipo non vengono controllati in fase di compilazione; piuttosto, le operazioni su un oggetto potrebbero fallire, a significare che l'oggetto dato non è di un tipo adatto. Nonostante sia digitato in modo dinamico, Python è fortemente digitato, impedendo operazioni che non sono ben definite (ad esempio, aggiungendo un numero a una stringa), piuttosto che cercare silenziosamente di capirle.

Scala è un linguaggio tipizzato staticamente, ovvero i tipi vengono controllati in fase di compilazione. Un meccanismo di inferenza di tipo locale si preoccupa che all'utente non sia richiesto di annotare il programma con informazioni di tipo ridondanti. Le operazioni che interrompono i vincoli di tipo portano a errori del compilatore, non a errori di runtime. Vedi anche The Purpose of Scala's Type System, in particolare la sezione in cui viene discussa la digitazione anatra.

-2

Python è dinamicamente-digitato, mentre l'inferenza tipo è possibile solo nei linguaggi staticamente tipizzati. La tipizzazione statica sarebbe impossibile da implementare senza rilasciare il supporto per funzionalità come elenchi di oggetti arbitrari.

+0

Non sono sicuro. Per "x = 123" il compilatore dovrebbe essere in grado di dedurre che x è un numero intero. – Thilo

+1

@Thilo: "x = 123; x = str (x); x = [c per c in x]", è x un int, una stringa o un elenco? –

+0

@Lie Ryan, immagino che il compilatore possa riscrivere i nomi degli identificatori, in modo che tutti possano vivere insieme. 'x_int = 123; x_str = str (x_str); x_list = [c per c in x_str] '. –

2

Python non fa inferenza di tipo statico, perché vuole farti fare cose che sono impossibili sotto un tale regime. Ad esempio:

def myfn(): 
    if random.random() > 0.5 
    return "howdy" 
    else: 
    return 7 

x = myfn() # Am I a string or an integer? 

Quale dovrebbe essere il tipo di x?

EDIT: ad esempio era:

def myfn(x): 
    try: 
    return str(x[0]+1) + " is my favourite" 
    catch IndexError: 
    return x+1 

myfn(1) # = 2 
myfn([2,4,6]) # = "3 is my favourite" 
+0

Beh ... potrebbe generare due funzioni dietro la scena: Sequenza -> str (o forse Sequenza -> Sequenza) e int -> int. Un po 'come sovraccaricare. –

+0

OK, lo aggiusterò a qualcosa che è ancora più banale ma difficile da tracciare. –

+1

def myfn (x: Array [Int]) = prova Left (str (x (0) + 1) catch {case e: ArrayIndexOutOfBoundsException => Right (x + 1) –

Problemi correlati