Teoría de los tipos: ¿la comprensión de la correspondencia de Curry-Howard lo convierte en un mejor programador?

Sí.

Rutinariamente escribo código en Haskell que “no soy lo suficientemente inteligente como para escribir” apoyándome mucho en Curry-Howard. Para mí, la correspondencia Curry-Howard me proporciona mucha información sobre cómo estructurar mejor mi código.

¡La vista de los tipos como proposiciones y programas como pruebas es más importante cuanto más abstracto puedas hacer las proposiciones!

Cuanto más abstracto pueda hacer sus propuestas y, por lo tanto, más generales sus tipos, más escenarios podrá reutilizar. Esto reduce la contaminación del espacio de nombres desde una perspectiva de ingeniería de software y fomenta la reutilización del código por una razón profundamente fundamental, no un anuncio hoc uno.

Además, al hacer que sus tipos sean más generales, obtiene menos implementaciones posibles que pueden escribir check. Esto le da una gran comprensión de por qué su código se comporta de la manera que lo hace y por qué debe comportarse de esa manera.

Por ejemplo, en realidad es bastante fácil arruinar la escritura de la mónada de estado, pero es casi imposible escribir la mónada de estado indexado, a pesar de que este último tiene un tipo más complejo.

Mejorar la generalidad de su código a través de la paramétrica y Curry-Howard le otorga teoremas libres más fuertes, que son leyes que puede usar para razonar sobre el comportamiento de su código solo a partir de las firmas de tipo involucradas, sin preocuparse por la implementación de la función. Esto a menudo le permite lograr el santo grial de encapsulación OOP simplemente siguiendo el mismo proceso que hace que sus tipos sean más generales y su código más reutilizable, pero de tal manera que no esté en deuda con un programador que haga lo correcto. Obtiene la encapsulación en cuestión “gratis” de los tipos y el espacio de posibles pruebas.

Si va más allá y avanza hacia la correspondencia “Curry-Howard-Lambek” que le brinda el puente de tres vías entre los tipos, las proposiciones y la teoría de categorías, puede tomar prestadas aún más herramientas en la división. La comprensión de las mónadas y las comadradas como una forma de modalidad le permite razonar sobre los sistemas de efectos utilizando la posibilidad y la necesidad modales, la modalidad (!) En lógica lineal puede verse como una comonad, la lógica lineal puede verse como el lenguaje interno de un simétrico categoría monoidal, etc.

Esto le permite mover el conocimiento entre matemática pura, programación, incluso física cuántica; después de todo, esa es solo otra categoría monoidal. Rutinariamente uso diagramas de seguimiento de la teoría de categorías cuando trabajo con cualquier cosa, desde uniones de bases de datos hasta nudos para definir la mónada correcta para que funcionen mis analizadores.

Una vez que sepa cómo funciona ese puente, ¡puede mover mucha información a través de él!

Te da una perspectiva diferente y te ayuda a pensar en los programas de una manera nueva. Eso es ciertamente algo bueno . La verdadera pregunta es: ¿qué tan bueno?

Solo creo que será particularmente relevante si usas un lenguaje mecanografiado agradable como Haskell o ML. En estos casos, pensar en los tipos como lógica puede hacer que escribir y trabajar con tipos para su problema sea mucho más intuitivo. Esta es una ventaja directa y práctica. Ya tenemos una buena intuición para las declaraciones lógicas y creo que aplicar eso para diseñar programas es un beneficio definitivo.

Por ejemplo, Curry-Howard me ayudó a pensar acerca de lo que realmente significa el tipo de fix :: (a -> a) -> a y por qué a menudo conduce a un bucle infinito. Básicamente está diciendo que si tienes una tautología a -> a , puedes probar cualquier cosa a – ¡ a proposición que no es muy útil para el razonamiento lógico!

En términos más generales, Curry-Howard también facilita pensar en isomorfismos entre tipos. Puede ver cómo un tipo como (a, ()) realmente no agrega ninguna información a a porque a && True == a . Dicho esto, encontré que la relación entre tipos y números (como El álgebra de los tipos de datos algebraicos) es aún más útil para este propósito.

Si usa un lenguaje menos agradable y menos escrito, será menos útil de inmediato. Sigo afirmando que te hará mejorar de una manera difusa, pero no conferirá ninguna ventaja práctica inmediata ni siquiera hará un gran cambio. Aún así, pensar en su lenguaje de programación como un sistema formal puede ayudar a razonar y diseñar su código, incluso si su lenguaje no fue diseñado con ese tipo de pensamiento en mente.

¿Solo saberlo? Probablemente no.

¿Comprendiendo profundamente que los programas y las pruebas son muy similares y (bajo algunas definiciones de términos) isomorfos? Sí. ¿Comprende un lenguaje fuerte estáticamente tipado a un nivel profundo (incluso si programa principalmente en un lenguaje dinámico como Python o Clojure)? Si, absolutamente. Aprendes mucho sobre cómo diseñar programas cuando trabajas con la escritura estática de esclavitud y disciplina de un Haskell u Ocaml, y eso es increíblemente útil sin importar en qué termines programando.

Probablemente no. Comprender Curry-Howard es importante para un diseñador de lenguaje de programación, pero no para un programador general.

Depende de lo que llames programación …

  • Si tiene la suerte de escribir principalmente código algorítmico abstracto, posiblemente
  • Si tiene que usar Bootstrap y JS para procesar los datos en una página web que necesita comunicarse con una base de datos dBase4 antigua a través de una conexión PPP, hay poco uso de ese conocimiento exaltado