2012-06-21 7 views
9

En F # mantra parece haber una evitación visceral de null, Nullable<T> y su tipo. A cambio, se supone que debemos usar tipos de opciones. Para ser honesto, realmente no veo la diferencia.¿Cuál es la diferencia entre un tipo de opción y un tipo que admite nulos?

  • Mi comprensión del tipo # F es la opción que le permite especificar un tipo que puede contener cualquiera de sus valores normales, o None. Por ejemplo, un Option<int> permite todos los valores que puede tener un int, además de None.

  • Mi comprensión de los tipos anulables de C# es que le permite especificar un tipo que puede contener cualquiera de sus valores normales, o null. Por ejemplo, un Nullable<int> a.k.a int? permite todos los valores que puede tener un int, además de null.

¿Cuál es la diferencia? Reemplaza el vocabulario con Nullable y Option, null y None, y básicamente tienes lo mismo. ¿De qué se trata todo el alboroto sobre null?

+2

Se trata de evitar errores lógicos tan pronto como sea posible: con 'option', se obtiene un error/advertencia del compilador por no verificar' None'; con 'null' no lo haces. – ildjarn

+0

Entonces, en teoría, si hubiera un C# con coincidencia de patrón que asegurara que manejaste el caso 'nulo', sería un lavado? –

+0

IMO, más o menos, aunque otros dirían lo contrario sobre la sensibilidad _semantic_ de 'null'. – ildjarn

Respuesta

16

opciones F # son generales, puede crear Option<'T> para cualquier tipo 'T.

Nullable<T> es un tipo terriblemente raro; solo puede aplicarlo a las estructuras, y aunque el tipo Nullable es en sí mismo una estructura, no se puede aplicar a sí mismo. Por lo tanto, no puede crear Nullable<Nullable<int>>, mientras que puede crear Option<Option<int>>. Tuvieron que hacer algo de magia de marco para que eso funcione para Nullable. En cualquier caso, esto significa que para Nullables, debe saber a priori si el tipo es una clase o una estructura, y si se trata de una clase, solo necesita utilizar null en lugar de Nullable. Es una abstracción fea y permeable. su principal valor parece ser la interoperabilidad de la base de datos, ya que supongo que es común tener objetos `int, o no value 'para tratar en los dominios de la base de datos.

Mi opinión es que el framework .Net es un feo desastre cuando se trata de null y Nullable. Puede argumentar que F # 'se suma al desastre' teniendo Option, o que lo rescata del desastre sugiriendo que evite solo nulo/Nullable (excepto cuando sea absolutamente necesario para la interoperabilidad) y concéntrese en soluciones limpias con Option s. Puedes encontrar personas con ambas opiniones.

También puede ver

Best explanation for languages without null

+0

En respuesta a _why_ F # agrega 'opción' <_> 'vale la pena enfatizar que' Nullable' está profundamente relacionado con 'null', que F # intenta eliminar de la consideración. – Daniel

+0

@Daniel, y también, 'option' viene de ML/OCaml, y F # nació de OCaml-compat. Pero sí, en su mayor parte, F # intenta relegar null solo a los escenarios '.Net interop'. – Brian

2

La ventaja de utilizar option es que hace explícita de que una variable puede contener ningún valor, mientras que los tipos anulables dejan implícito.Da una definición como:

string val = GetValue(object arg); 

El sistema de tipos no documenta si val nunca puede ser nulo, o lo que sucederá si arg es nulo. Esto significa que se deben realizar verificaciones repetitivas en los límites de la función para validar las suposiciones de la persona que llama y la llamada.

Junto con coincidencia de patrones, código usando tipos de opción se puede comprobar de forma estática para asegurar ambos casos se manejan, por ejemplo los siguientes resultados de código en una advertencia:

let f (io: int option) = function 
| Some i -> i 
5

Debido a que cada tipo de referencia NET puede tener este valor adicional, sin sentido, ya sea o no es nulo, existe la posibilidad y debe verificarlo, y como Nullable usa null como su representación de "nada", creo que tiene mucho sentido eliminar todo eso rareza (que F # hace) y requieren la posibilidad de que "nada" sea explícito. Option<_> hace eso.

4

¿Cuál es la diferencia?

F # le permite elegir si desea o no que el tipo sea un tipo y option, cuando lo hace, le anima a comprobar si hay None y hace que la presencia o ausencia de None explícita en el tipo.

C# obliga a cada tipo de referencia a permitir null y no lo alienta a verificar null.

Por lo tanto, es simplemente una diferencia en los valores predeterminados.

Reemplaza el vocabulario con Nullable y Opción, nulo y Ninguno, y básicamente tienes lo mismo. ¿De qué se trata todo este alboroto?

Como idiomas como el SML, OCaml y Haskell han demostrado, la eliminación de null elimina una gran cantidad de errores de tiempo de ejecución de código real. En la medida en que el creador original de null incluso lo describe como su "billion dollar mistake".

Cuestiones relacionadas