ventajas simbolos programacion inteligencia funcional español desventajas caracteristicas artificial aplicaciones haskell type-systems

haskell - simbolos - programacion funcional



¿Es Haskell un lenguaje de programación fuertemente tipado? (4)

Creo que estás hablando de dos cosas diferentes.

Primero, haskell y los lenguajes de programación más funcionales (FP), NO tienen el concepto "variable". En su lugar, utilizan el concepto "nombre" y "valor", simplemente "unen" un valor a un nombre. Una vez que el valor está vinculado, no puede vincular otro valor al mismo nombre, esta es la característica clave de FP.

La tipificación fuerte es otro tema. Sí, haskell está fuertemente tipado, al igual que la mayoría de los idiomas de FP. La escritura fuerte le da a la FP la capacidad de "inferencia de tipos" que es poderosa para eliminar errores ocultos en el tiempo de compilación y ayudar a reducir el tamaño del código fuente.

¿Tal vez estás comparando haskell con python? Python también está fuertemente tipado. La diferencia entre haskell y python es "de tipo estático" y "de tipo dinámico". El significado real de los términos "tipo fuerte" y "tipo débil" son ambiguos y difusos. Esa es otra larga historia ...

¿Haskell está fuertemente tipado? Es decir, ¿es posible cambiar el tipo de una variable después de asignar una? Parece que no puedo encontrar la respuesta en internet.



Pareces mezclar escritura dinámica / estática y débil / fuerte.

La escritura dinámica o estática trata sobre si el tipo de una variable se puede cambiar durante la ejecución.

La tipificación débil o fuerte consiste en poder predecir errores de tipo solo a partir de firmas de funciones.

Haskell está tipificado estática y fuertemente.

Sin embargo, no hay tal cosa como una variable en Haskell, por lo que hablar de tipificación dinámica o estática no tiene sentido, ya que cada identificador asignado con un valor no se puede cambiar en la ejecución.

EDITAR: Pero como dijo Goldenbull, esas nociones tipográficas no están claramente definidas.


Estático : los tipos se conocen en tiempo de compilación. Java y Haskell se escriben estáticamente.

Un lenguaje escrito estáticamente puede o no tener una inferencia de tipo. Java carece casi completamente de inferencia de tipos (pero está cambiando muy lentamente solo un poco); Haskell tiene inferencia de tipo completo (excepto con ciertas extensiones muy avanzadas).

Dinámico - Python, Ruby, etc. Algunas personas lo llaman "unido"; dinámico puede ser "emulado" dentro de una configuración estática, pero lo contrario no es cierto a menos que agregue herramientas / complementos de análisis estático externo a un lenguaje tipificado de otro modo. Algunos lenguajes se mezclan dinámico y estático.

Fuertes : los valores que deben tratarse como Cat siempre lo son; tratar de tratarlos como un Dog causará un fuerte meeewww ... Quiero decir error.

Débil : esto se reduce efectivamente a 2 cosas similares pero distintas: tipo coerción (por ejemplo, "5"+3 es igual a 8 en PHP - o lo hace!) Y reinterpretación de la memoria (por ejemplo, (int) someCharValue o (bool) somePtr en C, y C ++ también, pero C ++ quiere que digas explícitamente reinterpret_cast ). Así que realmente hay coerción-débil y reinterpretación-débil , y diferentes idiomas son débiles en una o ambas formas.

Es interesante observar que la coacción está implícita por naturaleza y la reinterpretación de la memoria es explícita (excepto en Ensamblaje), por lo que la tipificación débil consiste en un comportamiento implícito y explícito. Tal vez esa sea una razón más para referirse a 2 subcategorías distintas en la escritura débil.

Hay idiomas con las 4 combinaciones posibles, y variaciones / gradaciones de los mismos.

Haskell es estático + fuerte ; por supuesto, tiene unsafeCoerce por lo que puede ser estático + un poco reinterpretar-débil a veces, pero unsafeCoerce está muy mal visto, excepto en situaciones extremas en las que está seguro de que algo es el caso, pero parece que no puede convencer al compilador sin retrocediendo y volviendo a contar toda la historia de una manera diferente.

C es estático + débil porque toda la memoria se puede reinterpretar libremente como algo que originalmente no debía contener, por lo tanto, débil. Pero todas esas reinterpretaciones son rastreadas por el comprobador de tipos, por lo que todavía son completamente estáticas. Pero C no hace coacciones implícitas, así que solo se reinterpreta-débil .

Python es dinámico + casi completamente sólido : no hay tipos conocidos en ninguna línea de código antes de llegar a esa línea durante la ejecución, sin embargo, los valores que viven en tiempo de ejecución tienen tipos asociados y es imposible reinterpretar la memoria. Las coerciones implícitas también se mantienen en un mínimo significativo, por lo que se podría decir que Python es 99.9% fuerte y 0.01% coerción débil .

PHP y JavaScript son dinámicos + en su mayoría débiles - dinámicos, en que nada tiene tipografía hasta que ejecutas e inspeccionas su contenido, y también es débil en cuanto a que las coacciones ocurren todo el tiempo y con cosas que realmente nunca esperarías que te coaccionaran, a menos que lo seas. solo se llama a métodos y funciones y no se utilizan operaciones integradas. Estas coerciones son una fuente de mucho humor en internet. No hay reinterpretaciones de memoria, por lo que PHP y JS son débiles por coerción .

Además, a algunas personas les gusta pensar que la escritura estática se refiere a las variables que tienen tipo, y la tipificación fuerte se refiere a los valores que tienen tipo; esta es una forma muy útil de entender la imagen completa, pero no es del todo cierto : algunos idiomas de tipo dinámico también permite que las variables / parámetros sean anotados con tipos / restricciones que se aplican en tiempo de ejecución.

En escritura estática, es expresiones que tienen un tipo; el hecho de que las variables tengan tipo es solo una consecuencia de que las variables se usen como un medio para unir expresiones más grandes con otras más pequeñas, por lo que no son las variables las que tienen tipos.

De manera similar, en la tipificación dinámica, no son las variables que carecen del tipo estáticamente conocido, ¡son todas las expresiones! Las variables que carecen de tipo son simplemente una consecuencia de las expresiones que almacenan que carecen de tipo.

Una ultima ilustracion

En la tipificación dinámica, todos los gatos, perros e incluso elefantes (¡de hecho zoológicos enteros!) Están empaquetados en cajas de tamaño idéntico.

En la escritura estática, estos cuadros se ven diferentes y tienen etiquetas que dicen lo que hay dentro.

A algunas personas les gusta porque solo pueden usar un factor de forma de una sola caja y no tienen que poner ninguna etiqueta en las cajas; es solo la disposición de las cajas entre sí lo que implícitamente (y con suerte) proporciona la cordura de tipos.

A algunas personas también les gusta porque les permite hacer todo tipo de trucos con los tigres transportados temporalmente en cajas que huelen a leones, y los osos colocan la misma serie de cajas interconectadas como lobos o ciervos.

En tal configuración de cajas de transporte sin etiquetas, todos los escenarios lógicos posibles deben jugarse o simularse para detectar una desalineación en la disposición implícita, como en una representación de escenario. No se pueden dar garantías confiables basadas únicamente en el razonamiento, en términos generales. (Casos de prueba ad hoc que requieren la puesta en marcha de todo el sistema para obtener conclusiones parciales de su solidez)

Con etiquetas y reglas explícitas sobre cómo tratar con cajas de varias etiquetas, se puede utilizar el razonamiento lógico automatizado / mecanizado para sacar conclusiones sobre lo que el sistema de logística no hará o hará con seguridad (verificación estática, prueba formal o menos pseudoa prueba, como QuickCheck), algunos aspectos de la logística aún deben verificarse con ejecuciones de prueba, como por ejemplo, si el equipo de logística incluso acertó al cliente. (Pruebas de integración, pruebas de aceptación, controles de salud del usuario final).

Además, en los perros débiles de mecanografía se pueden dividir y volver a montar como gatos frankenstein. Les guste o no, y si el resultado es feo o no. (escritura débil)

Pero si agrega etiquetas a las cajas, sigue siendo importante que los gatos Frankenstein se pongan en cajas para gatos. (escritura estática + débil)

Mientras escribe fuerte, puede poner un gato en la caja de un perro, pero solo puede seguir fingiendo que es un perro hasta que intente humillarlo alimentándolo con algo que solo los perros comen. Si eso sucede, gritará en voz alta , pero hasta ese momento, si estás escribiendo a máquina dinámicamente, aceptará su lugar en silencio (en un mundo estático, se negaría a ponerlo en la caja de un perro antes de que puedas decir "gatito").