Si alguien reescribe Haskell utilizando el conocimiento de hoy, ¿qué cambiaría?

Hay un montón de pequeñas inconsistencias y reliquias. Los obvios que puedo pensar son:

La asignación de tipos usa dos puntos porque los dos puntos están reservados para las listas a pesar del hecho de que el cálculo lambda escrito siempre usa dos puntos para la asignación de tipos.

El nombre de “fmap” suena como una extensión de “mapa” cuando realmente map es solo una de las muchas instancias de fmap.

“Return” y “pure” son la misma función pero para diferentes clases de tipos, aunque una herede de la otra.

La sintaxis “if then else” es bastante fea e innecesaria ya que podría ser su propia función:

if :: Bool -> a -> a -> a

Fue bastante interesante leer la documentación de PureScript porque está muy influenciado por Haskell, pero dado que fue diseñado mucho más recientemente que Haskell, parece ser mucho más limpio en muchos de estos aspectos.

Una cosa que algunas personas, incluyéndome a mí, consideran que una verruga de diseño es la forma en que funcionan los registros. Cuando utiliza la sintaxis de registro para crear un tipo de datos similar a una estructura, los nombres de los campos se convierten en funciones para acceder a esos campos en el ámbito global. Un archivo no es necesariamente el ámbito más natural para dicho nombre, por lo que a menudo terminas viendo que los nombres de campo tienen la forma “ “, que es esencialmente un nombre de variable de uso ad-hoc para simular espacios de nombres: Concepto real que queremos.

Creo que su pregunta es lo suficientemente diferente de esta pregunta anterior como para justificar que no se fusionen, pero definitivamente querrá consultar otras respuestas enumeradas aquí, como un sistema de módulos no demasiado innovador.

Pero algo bueno de Haskell es que la gente realmente parece solucionar los problemas en lugar de acostumbrarse a ellos. Hace unos años, alguien podría haber respondido a su pregunta con “la herramienta apesta”, pero ahora tenemos una pila, o alguien podría haber dicho “se requiere una evaluación estricta con la suficiente frecuencia como para que forzarla con una sintaxis especial sea engorrosa”, pero ahora hay una estricta extensión de idioma O alguien podría haber dicho “Dios, las palabras que las personas usan para hablar sobre Haskell suenan como Star Trek y una tesis doctoral oscura, ¿qué tal algunos tutoriales en inglés sencillo?”, Y luego alguien escribió un gran tutorial con ejemplos / ilustraciones como un libro para niños.

La clase de tipo `Num` se dividiría en partes más pequeñas. Para ver un ejemplo de lo que está mal con la implementación actual: mire el tipo `Complejo`. Si `Num` solo contenía +, – y *: entonces podríamos implementar` instancia Num a => Num (Complejo a) `; pero dado que ‘Num’ también contiene abs y signum, la restricción tiene que ser RealFloat.