2010-11-06 9 views
8

F # no admite conversiones implícitas. Entiendo que esta es una característica, pero no entiendo por qué las conversiones implícitas están prohibidas incluso cuando no se pierde información. Por ejemplo:¿Por qué no hay conversiones implícitas en F #?

sqrt 4  // Won't compile. 

no veo un problema implícitamente convertir el int 4 a un float, que es lo que requiere sqrt.

¿Alguien puede arrojar luz sobre esto?

Respuesta

13

Porque su verificador de tipos casi depende de la reconstrucción de tipo fuerte clásica. Su ejemplo requiere la coerción de tipos que es posible mediante moldes implícitos o un sistema de tipo débil, pero estos no están permitidos en este tipo de inferencia de tipo.

Desde F # proviene de OCaml Tiene una reconstrucción tipo que trata de garantizar la corrección de su programa por ser extremadamente pedante: el algoritmo trata de unificar el conjunto de tipos de su programa para una buena escribir y esto no puede hacerse si una regla de tipo débil permite considerar un entero como un flotador.

+0

¿Quiso decir "... considerar un número entero como un flotador"? – royco

+0

sí, se corrigió que también si el punto se puede revertir para el caso opuesto (ampliación o tipo numérico restrictivo) – Jack

+0

¿Sería mejor decir que tener una regla de tipo más débil conduciría a un espacio de búsqueda mucho más grande que el compilador tiene que proceso para probar que los tipos son todos "lógicamente correctos". –

5

Además de las respuestas anteriores, las conversiones entre enteros y flotantes son not actually free en términos computacionales; el compilador es no haciéndote un favor "ocultándoselos" si tu objetivo es escribir código de alto rendimiento. Esta es una de las cosas que me gustan de OCaml y F #: incluso si son de muy alto nivel, aún necesita saber exactamente qué cálculos está haciendo.

Cuestiones relacionadas