2009-08-20 8 views
13

He estado leyendo acerca de la técnica de programación de estilo de continuación de continuación (implementación de C# 3.0).Cuándo y cómo usar el estilo de paso de continuación

¿Por qué/cuándo sería útil usar esta técnica?

¿Cómo puedo implementar esto para obtener esas cadenas realmente largas? ¿Es esto lo mismo que currying (que produce algunos mejores resultados de búsqueda en google)?

Gracias

Respuesta

12

Un excellent write-up en CPS en C# contexto se hizo por Wes Dyer. No creo que pueda agregar nada significativo a eso. Si algunas cosas específicas no están claras allí, continúe y pregunte sobre ellas.

+1

1 Muy buena lectura: "La mayoría de los programadores han utilizado las funciones que tienen una devolución de llamada A menudo, la devolución de llamada es el código que se invoca al término de la función En estos casos, la devolución de llamada es una continuación pasó explícitamente..." (De artículo) –

+2

"continuaciones son los homólogos funcionales de GOTOs tanto en el poder y hermetismo. Pueden expresar flujo de control arbitrario como corrutinas y excepciones mientras desconcertantes algunos de los programadores más brillantes". - Pueden volverse locos. Comience a mezclar las continuidades de fallas, las continuas de éxito y más, y puede hacer locas operaciones AI-esque en unas pocas docenas de líneas de código difícil de entender pero bello. – Eagle

+0

@Eage: me niego a aceptar este juicio negativo. Uno no solo compara las continuaciones con goto. esto es descabellado –

5

Para responder a su última pregunta, el estilo de continuación de aprobación no es lo mismo que currying. Usted curry cuando crea una función a partir de otra función, especificando uno o más de sus parámetros, obteniendo así una función con menos parámetros. Currying en un lenguaje de programación funcional, como F # y C# hasta cierto punto, le permite tratar todas las funciones como una función de una variable. Si dicha función tiene más de un parámetro, entonces puede verse como tener un parámetro y devolver otra función con los parámetros restantes. Este es un ejemplo de currying en C#:

public static class FuncExtensions 
{ 
     public static Func<A, Func<R>> Curry<A, R>(this Func<A, R> f) 
     { 
      return a =>() => f(a); 
     } 
} 

Func<int, int> f = x => x + 1; 

Func<int> curried = f.Curry()(1); 

Cuando el curry función siempre devolverá 2. Hay, por supuesto, los usos más iluminadoras de esto.

En lo que respecta al estilo de continuación de paso, además del blog de Wes Dyer vinculado, consulte F # flujos de trabajo asincrónicos, que son instancias de continuación, o la mónada de continuación. Puede intentar utilizar el término mónada de continuación para buscar algunos artículos adicionales.

Cuestiones relacionadas