Haskell es mi idioma favorito, es un lenguaje funcional puro. No tiene efectos secundarios, no hay asignación. Si encuentra difícil la transición a este idioma, tal vez F # es un mejor lugar para comenzar con la programación funcional. F # no es puro.
Los objetos encapsulan estados, hay una manera de lograr esto en Haskell, pero este es uno de los problemas que lleva más tiempo aprender porque debe aprender algunos conceptos de teoría de categorías para comprender profundamente las mónadas.Hay azúcar sintáctico que te permite ver las mónadas como una tarea no destructiva, pero en mi opinión es mejor dedicar más tiempo a entender la base de la teoría de categorías (la noción de categoría) para obtener una mejor comprensión.
Antes de intentar programar en estilo OO en Haskell, debería preguntarse si realmente usa el estilo orientado a objetos en C#, muchos programadores usan lenguajes OO, pero sus programas están escritos en el estilo estructurado.
La declaración de datos le permite definir estructuras de datos que combinan productos (equivalentes a estructura en lenguaje C) y uniones (equivalentes a unión en C), la parte derivada de la declaración permite heredar métodos predeterminados.
Un tipo de datos (estructura de datos) pertenece a una clase si tiene una implementación del conjunto de métodos en la clase. Por ejemplo, si puede definir un método show :: a -> String para su tipo de datos, entonces pertenece a la clase Show, puede definir su tipo de datos como una instancia de la clase Show.
Esto es diferente del uso de la clase en algunos lenguajes OO donde se usa como una forma de definir estructuras + métodos.
Un tipo de datos es abstracto si es independiente de su implementación. Puede crear, modificar y destruir el objeto mediante una interfaz abstracta, no necesita saber cómo se implementa.
La abstracción es compatible con Haskell, es muy fácil de declarar. Por ejemplo el código desde el sitio Haskell:
data Tree a = Nil
| Node { left :: Tree a,
value :: a,
right :: Tree a }
declara los selectores izquierda, el valor, a la derecha. los constructores pueden definirse de la siguiente manera si quiere añadirlos a la lista de exportación en la declaración de módulo:
node = Node
nil = Nil
módulos están construidos de una manera similar a la del Modula. Aquí hay otro ejemplo del mismo sitio:
module Stack (Stack, empty, isEmpty, push, top, pop) where
empty :: Stack a
isEmpty :: Stack a -> Bool
push :: a -> Stack a -> Stack a
top :: Stack a -> a
pop :: Stack a -> (a,Stack a)
newtype Stack a = StackImpl [a] -- opaque!
empty = StackImpl []
isEmpty (StackImpl s) = null s
push x (StackImpl s) = StackImpl (x:s)
top (StackImpl s) = head s
pop (StackImpl (s:ss)) = (s,StackImpl ss)
¡Hay más para decir sobre este tema, espero que este comentario ayude!
Depende en gran medida de las operaciones que desee realizar en ellas. ¿Puedes describir cómo te gustaría usar objetos de esas clases en tu programa? – sepp2k
Escogí un ejemplo al azar. Siéntase libre de asumir cualquier operación. Solo quiero tener una idea general sobre cómo se manejan esas situaciones en Haskell. – Kibarim