2010-04-23 9 views
20

Soy nuevo en la programación funcional y tengo algunas preguntas sobre el estilo de codificación y la depuración.Depuración Código F # y estilo funcional

estoy bajo la impresión de que uno debe evitar el almacenamiento de los resultados de las llamadas funcction en una variable temporal y luego regresar esa variable

por ejemplo,

let someFunc foo = 
    let result = match foo with 
       | x -> ... 
       | y -> ... 
    result 

Y en vez hacerlo de esta manera (que podría estar muy lejos?):

let someFunc foo = 
    match foo with 
    | x -> ... 
    | y -> ... 

que funciona muy bien desde una perspectiva de funcionabilidad, pero hace que sea mucho más difícil de depurar. No tengo forma de examinar el resultado si el lado derecho de -> hace algunas cosas funky.

Entonces, ¿cómo debo lidiar con este tipo de escenarios?

Respuesta

11

De cualquier manera es aceptable, ya que son simplemente la unión a la variable inmutable local.

Sin embargo, hay una trampa. Si lo usa como parte de un bucle recursivo utilizando llamadas de cola, el que usa la variable de temperatura eliminará la llamada de cola y, por lo tanto, tendrá un aumento en el espacio de pila.

+0

Gracias, no sabía que se rompe la recursividad de la cola. Supongo que necesito deshacerme de esas variables de resultado. Estoy jugando con una sintaxis c LISP en este momento; http://rogeralsing.com/2010/04/17/more-on-plastic/ Soo venció IronScheme ;-) –

4

No te dispararía si usabas la temperatura, pero tampoco me molestaría mi estilo ante la posibilidad de que tuviera que ver algo bajo depuración.

Además, la depuración de este tipo de cosas es mucho más fácil con el depurador visual de Visual Studio 2010, ya que puede usar puntos de interrupción dentro de cada expresión de coincidencia posible. También hay reloj rápido y otras funciones excelentes.

Para obtener una lista de las últimas características en el depurador de Visual Studio: http://msdn.microsoft.com/en-us/library/01xdt7cs.aspx

4

Poder ver el valor de retorno de una función en VS es una solicitud de larga duración. Otros valores de expresión intermedios también; en F #, por ejemplo, a menudo desea inspeccionar el centro de una tubería, lo cual es difícil de hacer. En el sentido de que la programación funcional significa "menos variables nominadas y locals" y "expresiones más grandes", esto tiene un impacto negativo en la generación actual de depuradores. (Por otra parte, con cosas como la mutabilidad de menos y más alto de abstracción, es de esperar que pase menos tiempo en el depurador.)

todavía hay muchas maneras los depuradores del futuro se pueden mejorar ...

Ver también

Do some Functional programming constructs reduce Debuggability?

20

para inspeccionar el medio de una tubería, sugiero la siguiente solución:

Pon este código en algún lugar:

[<AutoOpen>] 
module AutoOpenModule 

#if DEBUG 
let (|>) value func = 
    let result = func value 
    result 
#endif 

Habilitar "Paso a paso por propiedades y operadores en código administrado":

https://msdn.microsoft.com/en-us/library/cc667388(v=vs.100).aspx

Ahora usted debería ser capaz de entrar en el operador de la tubería.

+0

Completamente brillante. Esto es ahora una apreciada adición a nuestra base de código. – Kit

Cuestiones relacionadas