2010-11-06 5 views
6

veces en libros que ver esta sintaxis para la lista y el comprensiones en F #:¿Por qué se "desaprobó" en "F" las comprensiones?

seq { for i = 0 to System.Int32.MaxValue -> i } 

Esto es de Programming F# by Chris Smith, página 80. En el F # que viene con VS2010, esto no compila. Creo que -> ha quedado obsoleto. (Ver Alternative List Comprehension Syntax). Sin embargo, -> todavía se puede utilizar en comprensiones que implican gamas:

seq { for c in 'A' .. 'Z' -> c } 

Según Expert F# 2.0, página 58, esto es porque -> es la abreviatura de Seq.map largo de un intervalo.

  1. ¿Por qué se desaprobó el primer uso de ->?
  2. El uso actual de -> parece inconsistente. ¿Alguien puede reconciliar esto por mí?

Respuesta

10

La construcción -> sólo se admite en la sintaxis de la expresión de la secuencia de "simple" donde se está haciendo una proyección (Seq.map) sobre una fuente de datos utilizando la siguiente estructura:

seq { for <binding> in <input> -> <projection> } 

El primer ejemplo se mencionado es el uso de for .. to .. que es una construcción sintáctica diferente que for .. in, pero se puede volver a escribir usando el segundo (de hecho, casi siempre uso for .. in al escribir expresiones de secuencia):

seq { for i in 0 .. System.Int32.MaxValue -> i } 

En todas las demás formas de expresiones de secuencia, tendrá que usar yield. En versiones anteriores de F #, la sintaxis -> era equivalente a yield (y también había ->> que era equivalente a yield!). Así, por ejemplo, que fue capaz de escribir:

seq { -> 10    // You need 'yield' here 
     ->> [ 1; 2; 3 ] } // You need 'yield!' here 

Esta sintaxis es bastante extraño, así que creo que la razón principal para la fabricación de estos dos obsoleta es mantener el lenguaje coherente. La misma expresión de cálculo la sintaxis se usa en expresiones de secuencia (donde -> tiene algún sentido), pero también para otros tipos de cálculo (y puede definir el suyo propio), donde yield parece más apropiado (y también corresponde a return en flujos de trabajo asincrónicos u otras expresiones de cálculo).

La sintaxis específica de secuencia "simple" sigue siendo útil, porque te ahorra algo de tipeo (reemplazas do yield con solo ->), pero en casos más complicados, no guardas tantos caracteres y creo que el la sintaxis que usa -> & ->> puede parecer un poco críptica.

Cuestiones relacionadas