tipos programacion listas imprimir funciones funcional ejemplos definir composicion como haskell f# functional-programming algebraic-data-types discriminated-union

haskell - imprimir - listas en programacion funcional



¿Los tipos de datos algebraicos en Haskell igualan las uniones discriminadas en F#? (2)

No estoy muy familiarizado con Haskell (solo leí Learn You a Haskell ) pero todavía no he encontrado una diferencia básica entre los DU y los tipos de datos algebraicos de Haskell; ambos son intentos de modelar el mismo concepto. Una vez dicho esto, F # y Haskell tienen sistemas de tipos muy diferentes (por ejemplo, Haskell tiene clases de tipos / tipos de mayor jerarquía, F # está profundamente basado en OOP, etc.) por lo que hay asimetría, pero no se limita a estos tipos de datos.

Estoy aprendiendo a Haskell y me gustaría saber si los constructos conocidos en Haskell como los tipos de datos algebraicos son los mismos que discriminaban las uniones en F # o si hay algunas diferencias sutiles entre ellos.

También apreciaría mucho una buena comparación entre F # (mi primer lenguaje funcional) y otros lenguajes funcionales, especialmente en lo que respecta a conceptos similares pero con diferencias sustanciales pero importantes.


(Vengo de OCaml, pero revisé las cosas pertinentes de F # y parece lo mismo. Corrígeme si me equivoco). Son lo mismo, solo terminología diferente para la misma cosa, pero hay algunas diferencias sintácticas. Por ejemplo, para definir un constructor con múltiples elementos de datos, en OCaml y F # escribe el tipo como si estuvieran rellenos en una tupla:

Haskell:

data Whatever = Foo TypeA TypeB

OCaml / F #:

type whatever = Foo of typeA * typeB

Del mismo modo, para coincidir con el patrón, de manera similar actúa como un único argumento que es una tupla con todos los miembros de datos rellenos:

Haskell:

case x of Foo a b -> ...

OCaml / F #:

match x with Foo (a, b) -> ...

Editar: al parecer, lo siguiente no se aplica en F #

Además, en Haskell el constructor se convierte automáticamente en una función que puede usar por sí mismo como cualquier otro valor:

zipWith Foo xs ys

OCaml / F # no hacen esto. Puede definir manualmente sus propias funciones para cada constructor.