¿Para qué se usa Haskell en el mundo real? [cerrado]


475

Hay mucha expectación en torno a Haskell, sin embargo, es difícil obtener información sobre cómo se usa en las aplicaciones del mundo real. ¿Cuáles son los proyectos / usos más populares de Haskell y por qué sobresale en la solución de estos problemas?


56
No, no lo haré porque es una respuesta clara. No hay margen de maniobra para opiniones y tal. Solo quiero saber para qué se creó el idioma.
Sergio Tapia


12
@ Papuccino1, espera, ¿quieres saber para qué sirve o para qué fue creado ? El primero es lo que pide la pregunta, y hay una gran cantidad de espacio para las opiniones allí ...
bdonlan

3
@ Papuccino1 - ¿Qué beneficio aportan las palabras adicionales en su título a la pregunta? Además, creo que está malinterpretando el uso del término "funcional" en este contexto, pero es difícil saberlo.
Chris Lutz

2
De acuerdo con su propio sitio web muchas empresas lo utilizan para diferentes tipos de propósitos ... haskell.org/haskellwiki/Haskell_in_industry
Julian

Respuestas:


309

¿Cuáles son algunos usos comunes de este idioma?

Desarrollo rápido de aplicaciones.

Si desea saber "¿por qué Haskell?", Debe considerar las ventajas de los lenguajes de programación funcionales (tomados de https://c2.com/cgi/wiki?AdvantagesOfFunctionalProgramming ):

  • Los programas funcionales tienden a ser mucho más concisos que sus contrapartes ImperativeLanguage. A menudo, esto conduce a una mayor productividad del programador.

  • FP fomenta la creación rápida de prototipos. Como tal, creo que es el mejor paradigma de diseño de software para ExtremeProgrammers ... pero ¿qué sé?

  • FP es modular en la dimensión de funcionalidad, donde ObjectOrientedProgramming es modular en la dimensión de diferentes componentes.

  • La capacidad de tener tu pastel y comértelo. Imagine que tiene un sistema OO complejo que procesa mensajes: cada componente puede realizar cambios de estado según el mensaje y luego reenviar el mensaje a algunos objetos con los que tiene enlaces. ¿No sería demasiado genial poder revertir fácilmente cada cambio si algún objeto en lo profundo de la jerarquía de llamadas decidiera que el mensaje es defectuoso? ¿Qué tal tener una historia de diferentes estados?

  • Muchas tareas de limpieza hechas para usted: deconstruir estructuras de datos (PatternMatching), almacenar enlaces variables (LexicalScope con cierres), tipeo fuerte (TypeInference), GarbageCollection, asignación de almacenamiento, ya sea en caja (puntero a valor) o sin caja (valor directamente ) representación ...

  • Multithreading seguro Las estructuras de datos inmutables no están sujetas a condiciones de carrera de datos y, en consecuencia, no tienen que estar protegidas por bloqueos. Si siempre asigna nuevos objetos, en lugar de manipular destructivamente los existentes, el bloqueo puede ocultarse en el sistema de asignación y GarbageCollection.

Aparte de esto, Haskell tiene sus propias ventajas, tales como:

  • Sintaxis clara e intuitiva inspirada en la notación matemática.
  • Lista de comprensiones para crear una lista basada en listas existentes.
  • Expresiones lambda: crea funciones sin darles nombres explícitos. Entonces es más fácil manejar fórmulas grandes.
  • Haskell es completamente referencialmente transparente . Cualquier código que use E / S debe estar marcado como tal. De esta forma, lo alienta a separar el código con efectos secundarios (p. Ej., Poner texto en la pantalla) del código sin (cálculos).
  • La evaluación perezosa es una característica realmente agradable:
    • Incluso si algo suele causar un error, seguirá funcionando mientras no use el resultado. Por ejemplo, podría colocarlo 1 / 0como el primer elemento de una lista y seguirá funcionando si solo utiliza el segundo elemento.
    • Es más fácil escribir programas de búsqueda como este solucionador de sudoku porque no carga todas las combinaciones a la vez, solo las genera a medida que avanza. Puede hacerlo en otros idiomas, pero solo Haskell lo hace de manera predeterminada .

Puedes consultar los siguientes enlaces:


20
El siguiente pensamiento a menudo pasa por mi mente: en un lenguaje puro, una función siempre devuelve el mismo resultado cuando pasa los mismos parámetros. Esto es una garantia. Los lenguajes imperativos, en contraste, construyen todo sobre "declaraciones". Una declaración no viene con ningún tipo de garantía (excepto que su ejecución consume tiempo y produce calor). Por lo tanto, la base ya es inestable y todo lo que está encima de ella seguirá siendo inestable. Para mí, esta fue una de las razones para aprender Haskell.
Martin Drautzburg

8
Han pasado 6 años desde que se hizo esta pregunta y desde que debutó el lenguaje de programación Go. A pesar de tener un sistema de tipo más débil y en general ser "objetivamente inferior" (según los fanáticos funcionales / ML), se las arregló para enviar más (y más importante) software en esos 6 años que Haskell en sus 26 años. Me refiero a esto como un caso de estudio; Claramente, hay cosas que están frenando los lenguajes funcionales, y no todos se pueden atribuir a la exageración.
weberc2

3
Olvidaste un punto: codificar en Haskell es una maravilla absoluta;) Me he divertido tanto probando algunos problemas en Haskell.
J Atkin

8
@MartinDrautzburg Por supuesto, las declaraciones vienen con garantías. ¿Qué tipo de lenguaje útil tendría declaraciones sin garantías? Por ejemplo, en C x = 5;garantiza que después de ejecutarse, xcontiene el valor 5.
user253751

55
@ E4z9 Sí, pero en C ++ garantiza que operator =se llama. Y garantiza lo que sucede si no se define unoperator =
user253751

234

Creo que a las personas en esta publicación les falta el punto más importante para cualquiera que nunca haya usado un lenguaje de programación funcional: expandir su mente. Si eres nuevo en la programación funcional, entonces Haskell te hará pensar en formas que nunca antes habías pensado. Como resultado, su programación en otras áreas y otros idiomas mejorará. ¿Cuánto cuesta? Difícil de cuantificar.


2
Estoy usando un iPhone, Mac. ¿Dónde se usa Haskell? Quiero decir que para las aplicaciones que utilicé están escritas en Objective-C o Swift + algo para bases de datos y servidores. Swift también puede ser funcional. Así que de nuevo estoy confundido en cuanto a dónde se usa
Honey

2
Facebook hace detección de SPAM con él: code.facebook.com/posts/745068642270222/…
Alex

25
Esta respuesta, escrita en un tono diferente, dice que Haskell es un gran ejercicio para un programador, que la OMI no hace un gran lenguaje de propósito general
Passer By

55
En Keera Studios, escribimos juegos y aplicaciones para iOS y Android con Haskell.
Ivan Perez

1
Estoy totalmente de acuerdo con esto. He escrito mucho código durante décadas en idiomas imperativos. He estado explorando Haskell durante un par de meses y me ha abierto la mente a cosas que no había pensado antes.
Adahus

87

Hay una buena respuesta para lo que un lenguaje de propósito general como Haskell es bueno: escribir programas en general.

Para lo que se usa en la práctica, tengo tres enfoques para establecer eso:

Indica que es bueno para gráficos, redes, programación de sistemas, estructuras de datos, bases de datos, desarrollo, procesamiento de texto ...

Y finalmente, mi opinión sobre lo que es realmente fuerte en:

Espero que eso le dé una idea de cuán amplia es su pregunta, si se va a responder con alguna especificidad.


15
La nube de etiquetas está rota
Elliot Cameron

¿Se generó la nube de etiquetas usando wordcloud ?
Janus Troelsen

29

Un ejemplo de Haskell en acción es xmonad , un "administrador de ventanas con características en menos de 1200 líneas de código".


18

Del Wiki de Haskell :

Haskell tiene una amplia gama de usos comerciales, desde aeroespacial y defensa, hasta finanzas, hasta nuevas empresas web, empresas de diseño de hardware y fabricantes de cortadoras de césped. Esta página recopila recursos sobre el uso industrial de Haskell.

Según Wikipedia, el lenguaje Haskell se creó a partir de la necesidad de consolidar los lenguajes funcionales existentes en uno común que podría usarse para futuras investigaciones en el diseño de lenguaje funcional.

Según la información disponible, es evidente que ha superado su propósito original y se utiliza para mucho más que la investigación. Ahora se considera un lenguaje de programación funcional de propósito general.

Si todavía te preguntas, "¿Por qué debería usarlo?", Entonces lee el ¿Por qué usarlo? sección de Haskell Wiki Introducción.


13

Haskell es un lenguaje de programación de propósito general. Se puede usar para cualquier cosa que use en cualquier otro idioma. No estás limitado por nada más que tu propia imaginación. ¿En cuanto a lo que es adecuado? Bueno, casi todo. Hay pocas tareas en las que un lenguaje funcional no sobresalga.

Y sí, soy el Rayne de Dreamincode. :)

También me gustaría mencionar que, en caso de que no haya leído la página de Wikipedia, la programación funcional es un paradigma como la programación orientada a objetos es un paradigma. Por si acaso no lo sabías. Haskell también es funcional en el sentido de que funciona; funciona bastante bien en eso.

El hecho de que un idioma no sea un lenguaje orientado a objetos no significa que el idioma esté limitado por nada. Haskell es un lenguaje de programación de propósito general, y tiene el mismo propósito general que Java.


9

Tengo uno genial, Facebook creó una herramienta automatizada para reescribir el código PHP. Analizan la fuente en un árbol de sintaxis abstracta, hacen algunas transformaciones:

if ($f == false) -> if (false == $f)

No sé por qué, pero ese parece ser su estilo particular y luego lo imprimen bastante.

https://github.com/facebook/lex-pass

Usamos haskell para hacer lenguajes específicos de dominios pequeños. Grandes cantidades de procesamiento de datos. Desarrollo web. Arañas web. Pruebas de aplicaciones. Escritura de scripts de administración del sistema. Guiones de fondo, que se comunican con otras partes. Scripts de monitoreo (tenemos un DSL que funciona muy bien junto con munin, hace que sea mucho más fácil escribir el código de monitor correcto para sus aplicaciones).

Todo tipo de cosas en realidad. Es solo un lenguaje de uso general cotidiano con algunas características muy potentes y útiles, si tiene cierta inclinación matemática.


66
Re: el estilo FB, poner el falso antes del == significa que si olvida y solo escribe un solo =, entonces el comportamiento resultante será más obviamente incorrecto en lugar de realizar silenciosamente una operación de asignación involuntaria y continuar normalmente
Magnus

A eso es inteligente, tu fuerza ese error particularmente conocido en tiempo de compilación entonces.
Edgar Klerks

@EdgarKlerks, PHP no tiene tiempo de compilación. Esto obliga a que se genere la excepción donde se produjo el error, en lugar de conducir a un comportamiento extraño o errores en el código distante.
dfeuer

Aunque veo el beneficio de escribir falsea la izquierda, no veo el punto de usar una herramienta para hacerlo automáticamente: si ya tienes un ==operador, entonces ya sabes que no tienes el error del que parte lex-pass está destinado a atrapar, y si tienes un =lugar, no hay una forma segura de saber si es así o no deliberadamente.
Jeremy List

1
@JeremyList Quizás sean realmente estrictos con el estilo de codificación. Puedo ver que el código bien formateado invita a escribir código más bien formateado. Solo una suposición salvaje.
Edgar Klerks

6

De Haskell :

Haskell es un lenguaje de programación estandarizado, de uso general, puramente funcional , con una semántica no estricta y una tipificación estática fuerte. Lleva el nombre del lógico Haskell Curry.

Básicamente, Haskell se puede utilizar para crear casi cualquier cosa que normalmente se crearía con otros lenguajes de uso general (por ejemplo, C #, Java, C, C ++, etc.).


5

Por ejemplo, para desarrollar aplicaciones web HTML5 interactivas en tiempo real. Vea Elm , cuyo compilador está implementado en Haskell y cuya sintaxis toma muchos préstamos de Haskell.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.