12

he estado aprendiendo acerca de varios lenguajes funcionales desde hace algún tiempo incluyendo Haskell, Scala y Clojure. Haskell tiene un sistema de tipo estático muy estricto y bien definido. Scala también está tipado estáticamente. Clojure por otro lado, está tipeado dinámicamente.funcionales de programación y sistemas tipo

Así que mis preguntas son

  1. ¿Qué papel juega el sistema de tipos en un lenguaje funcional?
  2. ¿Es necesario que un idioma tenga un sistema de tipos para que sea funcional?
  3. ¿Cómo se relaciona el nivel "funcional" de un idioma con el tipo del sistema de tipos del lenguaje?

Respuesta

39

Una lengua no tiene por qué ser mecanografiadas a ser funcional - en el corazón de la programación funcional es la lambda calculus, que viene en variantes sin tipo y typed.

El sistema de tipos desempeña dos funciones:

  • que ofrece una garantía en tiempo de compilación que una clase de errores no puede ocurrir en tiempo de ejecución. La clase de errores generalmente incluye cosas como intentar agregar dos cadenas juntas, o tratar de aplicar un entero como una función.
  • Tiene algunos beneficios de la eficiencia, en la que los objetos en tiempo de ejecución no es necesario para llevar a sus tipos en todo, porque los tipos ya se han establecido en tiempo de compilación. Esto se conoce como type erasure.

En los sistemas de tipo avanzadas como Haskell de, el sistema de tipos puede proporcionar más beneficios:

  • sobrecarga: el uso de un identificador para referirse a operaciones en diferentes tipos
  • Permite una biblioteca para elegir automáticamente una Implementación optimizada basada en el tipo en que se usa (usando Type Families)
  • permite probar invariantes potentes en tiempo de compilación, como la invariante en un árbol rojo-negro (usando Generalised Algebraic Datatypes)
+1

Sin embargo, esas funciones avanzadas no se limitan inherentemente a los lenguajes funcionales. – sepp2k

+1

@ sepp2k true - ¿Puedes pensar en una característica de sistema de tipo que * está * intrínsecamente limitada a los lenguajes funcionales? –

+0

No. Es por eso que no diría que existe una gran relación entre el "nivel funcional de un idioma" y el sistema de tipos. – sepp2k

2
  1. Igual que en cualquier lenguaje de programación: ayuda a evitar/encuentra errores en su código. En el caso de tipeo estático, un buen sistema de tipos impide la compilación de programas con ciertos tipos de errores.
  2. No. El untyped lambda calculus es lo que podríamos llamar el prototipo de los lenguajes de programación funcionales y es, como su nombre indica, en su totalidad sin tipo.
  3. En un lenguaje funcional (así como cualquier otra lengua, donde una función se puede utilizar como un valor) el sistema de tipos necesita saber qué tipo de una función es. Aparte de eso, no hay nada especial acerca de los sistemas de tipo para lenguajes funcionales.

    En un lenguaje puramente funcional que necesita para efectos secundarios abstractos, por lo que querría el sistema de tipos a ser de alguna manera capaz de soportar eso. Por ejemplo, si desea tener un tipo de mundo como, por ejemplo, Limpiar, querría que el sistema de tipos admitiera tipos de exclusividad para garantizar el uso correcto.

    Si quiere tener una món IO como en haskell, necesitaría un tipo IO (aunque una clase de mónada como en Haskell no es necesaria para tener una món IO, por lo que no necesita un sistema de tipo, que lo admite).

+0

¿Quiere decir que no hay diferencia entre el nivel "funcional" de un idioma por estar tipeado estática o dinámicamente? –

+2

@ abhin4v: estoy seguro de lo que quiere decir con "nivel funcional" – sepp2k

14

¿Qué papel desempeña el sistema de tipos en un lenguaje funcional?

Para una excelente respuesta de Simon Marlow, me gustaría añadir que un sistema tipo, especialmente uno que incluye tipos de datos algebraicos, hace que sea más fácil escribir programas:

  • diseños de software, que en el objeto los lenguajes orientados a veces se expresan usando diagramas UML, se expresan muy claramente usando tipos. Esta claridad se manifiesta especialmente cuando no solo los valores tienen tipos, sino que también los módulos tienen tipos, como en Objective Caml o Standard ML.

  • Cuando una persona está escribiendo código, un par de heurística simple hacen que sea muy, muy fácil de escribir funciones puras basado en los tipos:

    • Valor de tipo función siempre se puede crear con un lambda .
    • Un valor del tipo de función siempre puede consumirse aplicándolo.
    • Se puede crear un valor de tipo de datos algebraico aplicando cualquiera de los constructores del tipo.
    • Se puede consumir un valor de un tipo de datos algebraico escudriñándolo con una expresión case.

    Sobre la base de estas observaciones, y en la simple regla de que a menos que haya una buena razón, una función debe consumir cada uno de sus argumentos, es bastante fácil de reducir el espacio de posibles código que podría escribir en una muy pequeña numero de candidatos Por ejemplo, simplemente no hay que muchas funciones sensibles de tipo (usando la notación Haskell)

    forall a . (a -> Bool) -> [a] -> Bool 
    

    el arte de utilizar tipos para crear código de programación se denomina tipo dirigida. Cuando funciona bien, escuchas que los programadores funcionales dicen cosas como "una vez que tenemos los tipos correctos, el código prácticamente se escribe solo". Dado que los tipos son generalmente mucho más pequeños que el código , esta es una gran victoria.

1

1: Igual que cualquier otra, que hace que deje de hacer las operaciones que están bien mal definida, o cuyo resultado sería 'sin sentido' para los seres humanos. Como la suma flotante en enteros.
2: No, el lenguaje de programación más antiguo del mundo, el cálculo lambda (sin tipo), es funcional y sin tipo.
3: Difícilmente, funcional simplemente significa sin efectos secundarios, sin mutaciones, transparencia referencial etcétera.

Solo recuerde que el lenguaje funcional más antiguo, el cálculo lambda sin tipo no tiene ningún sistema de tipo.

Cuestiones relacionadas