33

Tengo una idea aproximada de lo que es esto, pero si alguien tiene una explicación del "problema de expresión" que creen que es sucinta e intuitiva, me encantaría escucharla.¿Cuál es el 'problema de expresión'?

+6

¿Hay alguna clase de pregunta irónica, o una broma sutil? – x0n

+0

Dado que es un concepto razonablemente complicado, no estoy seguro de que llegue muy lejos con una explicación "sucinta e intuitiva", ¡aunque me alegraría demostrar que estaba equivocado! – Gian

+0

No es broma :) Una metáfora incompleta (y posiblemente algo inexacta) pero esclarecedora sería suficiente. – James

Respuesta

33

Reloj this lecture.

La idea es que su programa es una combinación de un tipo de datos y operaciones sobre él. El problema requiere una implementación que permita agregar nuevos casos del tipo y nuevas operaciones sin la necesidad de recompilar los módulos antiguos y mantener la seguridad del tipo estático (sin conversiones ni comprobaciones del tipo de tiempo de ejecución).

Es interesante observar que en los lenguajes de programación funcionales es fácil agregar nuevas operaciones, pero es difícil agregar casos al tipo de datos. Mientras que en un idioma OO es al revés. Esta es una de las grandes diferencias conceptuales entre los dos paradigmas de programación.

+1

Aquí hay una solución que muestra cómo el problema de expresión se puede resolver en Clojure (programación funcional) https://gist.github.com/elnygren/e34368a86d62f0cb75f04ba903f7834a – elnygren

+1

@elnygren He ahorcado su Gist y he reemplazado su código con Haskell: https: // gist.github.com/chrisdone/7e07b3a90474542c9d1ebef033c1ee6e –

+1

Una bifurcación más con el ejemplo de Scala aquí: https://gist.github.com/izmailoff/41c7f790eb97042c307885388754a0be –

13

La idea detrás del problema es que el texto es unidimensional. Incluso si tiene líneas y columnas, generalmente las lee, palabra por palabra, línea por línea. Lo mismo ocurre con el compilador.

Y trata de representar algún tipo de 2 o más datos dimensionales en él. Por ejemplo, una tabla en orden fila-mayor es el siguiente:

((A, B, C), (D, E, F), (G, H, I)) 

En esta representación, es bastante fácil añadir una nueva fila al final, sin tocar el resto:

((A, B, C), (D, E, F), (G, H, I), (J, K, L)) 

embargo, la adición columnas es problemático un poco, tienes que tocarlo 4 lugares diferentes:

((A, B, C, M), (D, E, F, N), (G, H, I, O), (J, K, L, P)) 

por lo general, se encuentra con este problema en la práctica, cuando se trata de clases abstractas: es bastante fácil de añadir un nuevo subtipo como un nuevo módulo, pero cuando agrega un nuevo método abstracto, necesitará tocar todos los módulos y agregarlo; necesitas hacer lo mismo en muchos lugares. Normalmente haces abstracciones para protegerte contra estas cosas repetitivas.

No existe solución a este problema siempre que utilice la representación 1D.

La solución a este problema sería un editor que le permita editar estas tablas como cosas como una tabla real y no como texto (en una vista similar a Excel, donde puede agregar nuevas columnas y filas).

Cuestiones relacionadas