Pregunta

Tengo un problema, que creo que se puede resolver mejor a través de un estilo funcional de programación.

Con un trasfondo muy imperativo, estoy acostumbrado a programar el diseño que incluye diagramas / descripciones de clase, diagramas de comunicación, diagramas de estado, etc. Sin embargo, todos estos diagramas implican, o se usan para describir, el estado de un sistema y los diversos efectos secundarios que las acciones tienen en el sistema.

¿Hay algún conjunto estandarizado de diagramas o símbolos matemáticos utilizados en el diseño de programas funcionales, o dichos programas se diseñan mejor con un pseudo código funcional corto (dado que las funciones serán mucho más cortas que las contrapartes imperativas)?

Gracias, Mike

¿Fue útil?

Solución

Hay un truco secreto para la programación funcional.

  1. Es en gran parte sin estado, por lo que los diagramas imperativos tradicionales no importan.

  2. La mayor parte de la notación matemática de variedades de jardín es también sin estado.

El diseño funcional se parece más al álgebra que a cualquier otra cosa. Vas a definir funciones y mostrarás que la composición de esas funciones produce el resultado deseado.

Los diagramas no son tan necesarios porque la programación funcional es algo más simple que la programación de procedimientos. Es más como la notación matemática convencional. Use técnicas matemáticas para mostrar que sus diversas funciones hacen lo correcto.

Otros consejos

Los programadores funcionales están más interesados ??en escribir ecuaciones que en escribir diagramas. El juego se llama razonamiento ecuacional y en su mayoría incluye

  • Sustituir iguales por iguales

  • Aplicando leyes algebraicas

  • La prueba ocasional por inducción

La idea es que escribas un código realmente simple que sea "manifiestamente correcto", luego usas el razonamiento ecuacional para convertirlo en algo que está más limpio y / o tendrá un mejor desempeño. El maestro de este arte es un profesor de Oxford llamado Richard Bird.

Por ejemplo, si quiero simplificar la expresión del esquema

(append (list x) l)

Sustituiré igual para igual como loco. Usando la definición de list que obtengo

(append (cons x '()) l)

Sustituyendo el cuerpo del anexo que tengo

(if (null? (cons x '())) 
    l
    (cons (car (cons x '())) (append (cdr (cons x '())) l)))

Ahora tengo estas leyes algebraicas:

(null? (cons a b)) == #f
(car   (cons a b)) == a
(cdr   (cons a b)) == b

y la sustitución es igual por igual que obtengo

(if #f
    l
    (cons x (append '() l))

Con otra ley, (if #f e1 e2) == e2 , recibo

(cons x (append '() l))

Y si uso la definición de añadir de nuevo, obtengo

(cons x l)

lo que he probado es igual a

<*>

No sé mucho acerca de la programación funcional, pero aquí hay dos cosas que he encontrado

  • ? (lambda) se usa a menudo para denotar un función
  • f ? g se utiliza para indicar la función composición
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top