2010-11-06 13 views
8

F # non supporta le conversioni implicite. Capisco che questa è una caratteristica, ma non capisco perché le conversioni implicite siano proibite anche quando nessuna informazione andrebbe persa. Per esempio:Perché non ci sono conversioni implicite in F #?

sqrt 4  // Won't compile. 

non vedo un problema implicitamente la conversione del int 4 ad un float, che è quello che sqrt richiede.

Qualcuno può far luce su questo?

risposta

13

Poiché il controllo del tipo dipende quasi dalla classica ricostruzione di tipo forte. L'esempio richiede la coassione di tipi che è possibile tramite i cast impliciti o un sistema di tipi deboli, ma questi non sono consentiti in questo tipo di inferenza di tipo.

Dal F # viene da OCaml Ha una ricostruzione tipo che cerca di garantire la correttezza del vostro programma per essere estremamente pedante: l'algoritmo cerca di unificare le intere tipologie di vostro programma per una buona digitazione e questo non può essere fatto se una regola di tipo debole consente di considerare un numero intero come un float.

+0

Intendevi dire "... considerare un numero intero come un galleggiante"? – royco

+0

sì, risolto anche se il punto può essere invertito per il caso opposto (allargando o limitando il tipo numerico) – Jack

+0

Sarebbe meglio dire che avere una regola di tipo più debole, porterebbe a uno spazio di ricerca molto più ampio che il compilatore deve processo per dimostrare che i tipi sono tutti "logicamente corretti". –

5

In aggiunta alle risposte precedenti, digitare le conversioni tra numero intero e float sono not actually free in termini computazionali; il compilatore è non facendoti un favore "nascondendoli" da te se il tuo obiettivo è scrivere codice ad alte prestazioni. Questa è una delle cose che mi piacciono di OCaml e F #: anche se sono di altissimo livello, devi comunque essere consapevole di quale calcolo stai facendo.

Problemi correlati