Admite la función de conceptos como la separación de declaración y de ejecución (interfaces y clases en Java)?

Acerca de cómo restringir el acceso (como modificadores de acceso en Java)?

  • Tenga en cuenta que si usted está trabajando en Haskell, usted no debe tratar de escribir un programa en Java, y viceversa. Trabaja con el lenguaje, en lugar de en contra de la corriente, se producen por lo general un código más limpio.
  • Aquí un pequeño ejercicio que hizo que intenta imitar algunas de las características OO. gist.github.com/877617 sin Embargo, no era nada más que un ejercicio. Yo no escribiría Haskell en un estilo del Java.
  • Hay algunos grandes respuestas, pero te sugiero que no pensar en cosas como esta como «OO» características. En Haskell, por ejemplo, la unidad principal de la encapsulación y ocultación de la aplicación es el módulo, y no está vinculado a una estructura de datos específica. Diseño Modular que era una buena cosa antes de que fuera utilizado en la programación orientada a objetos! Del mismo modo, el tipo de clases en Haskell específicamente rechazar el OO-ish idea de escribir la estructura de datos y sus comportamientos en un solo lugar, pero todavía separar eficazmente interfaz y la implementación.
  • AFAIK, incluso en C que divide las declaraciones y las implementaciones. También la restricción de acceso no es realmente un concepto de programación orientada a objetos. Ocultar datos puede ser, pero que es más acerca de cómo se usan las cosas de lo que las restricciones son impuestas por el lenguaje.
InformationsquelleAutor strider | 2011-03-24

4 Comentarios

  1. 57

    ¿Cómo se puede separar de la declaración y aplicación en Haskell?

    En Haskell puede definir un typeclass, que es bastante diferente de un objeto orientado a la clase, de modo que no se deje engañar por el nombre. El uso de la palabra clave class, puede declarar los nombres de función y tipo de firmas, que puede ser instanciado (aplicado) en otros lugares para un determinado tipo de datos.

    Por ejemplo, la Hashable typeclass define el hash función, que puede convertir cualquier instancia de tipo de datos en un Int. De tener una nueva funky tipo de datos que desea ser capaz de hash? Multa, una instancia de Hashable. Los tipos de datos más comunes son instanciado por el módulo que define Hashable (ver los enlaces de documentación para ‘Instancias’).

    Typeclasses no son la única manera para definir una interfaz. Un método que es a menudo subestimado, es una llanura antigua estructura de datos. Porque Haskell de primera clase de las funciones, se puede definir una estructura de datos que tiene funciones como campos:

    data ShuttleInterface =
      SI { launch    :: Delay -> IO Handle
         , deploy    :: Payload -> IO ()
         , getStatus :: IO Status
         }

    Y sus funciones pueden generar o consumir esta estructura de datos:

    deployAllSensors :: ShuttleInterface -> IO ()
    deployAllSensors shuttle = do
        status <- getStatus shuttle
        let notDeployed = filter (not . deployed) (sensors status)
        when (isOrbiting status) (mapM_ deploySensor notDeployed)
    
    -- we used the well-known Haskell functions: filter, not, , when, mapM_
    -- and some supporting functions were assumed:
    isOrbitting :: Status -> Bool
    deploySensor :: Sensor -> IO ()
    sensors :: Status -> [Sensor]
    deployed :: Sensor -> Bool

    ¿Cómo se puede restringir el acceso a los datos en Haskell?

    Para proporcionar la abstracción, Haskell utiliza Algebraicas Tipos De Datos. Para proteger los campos de los desarrolladores de declarar un tipo de datos, pero no de exportación es de constructores – en lugar de que sólo la exportación de un conjunto de seguros primitivas que mantener deseado invariantes.

    Por ejemplo, la Mapa módulo proporciona un árbol equilibrado. No podía garantizar el equilibrio si alguien pudiera declarar un Mapa utilizando las primitivas de la Branch y Leaf, por lo que los fabricantes no exportarlos. Construcción de un mapa debe depender de lo que se exporta a partir de los Datos.Mapa (y aquellos que tienen acceso a los constructores por el hecho de estar en el mismo módulo) como fromList, empty, singleton, y un montón de modificadores.

    • +1, tal vez es bueno señalar que, puesto que todos los datos es inmutable, es decir, la protección de los campos, aunque posible, no es casi tan importante como la programación orientada a objetos los lenguajes con tipos de datos mutables.
    • He encontrado otro ejemplo útil de «programación orientada a objetos-como» la sintaxis de Haskell: stackoverflow.com/questions/24235757/…
    • lo necesario no es la capacidad de evitar la modificación, pero la capacidad para prevenir dependiendo. Como sun.misc.Unsafe ha demostrado. Podría decirse que, programación orientada a objetos es acerca de la abstracción de los elementos internos.
    • Ocultar los detalles de implementación de los módulos es todavía una buena práctica, incluso si usted tiene la inmutabilidad.
    • Es muy importante, tener en cuenta, que tipo de clases NO son un reemplazo para OO clases o OO interfaces (como en Java)!! Que puede ser nombrado y se parecen, pero pensando que usted puede usar uno para el otro va a terminar en un gran lío. Confía en mí; me fui por ese camino.
    • Me refiero a algo que se puede hacer con una interfaz OO se puede hacer con un typeclass, además de un infierno de mucho más. Así que se puede usar como un reemplazo para las interfaces Java 99% del tiempo y ser muy feliz con el enorme aumento en el poder.

  2. 22

    Ver Haskell es pasado por alto Sistema de Objetos por Oleg Kiselyov y Ralf Laemmel para una explicación detallada de cómo los conceptos OO puede ser implementado en Haskell. Pero como Antal dijo en los comentarios, no trate de escribir un programa Java en Haskell.

    Recuerde que los objetos son un pobre hombre del cierre, y los cierres son de un hombre pobre del objeto.

    • ¿Puede por favor explicar mejor a qué te refieres con «del Objeto son buenos para el hombre del cierre» y vice-versa? Creo que el cierre como una función anidada que tiene acceso a las variables declaradas en el exterior ámbito. Un objeto en lugar parece definir un opaco límite entre el código que se encuentra en ella y el mundo exterior… Con esto en mente, yo no puede entender lo que significa. :/
    • Usted puede pensar en un cierre como un método ad-hoc objeto; al igual que el de un objeto que se envuelve un montón de datos con un enlazado dinámicamente la función que se va a usar. Así que para una OO programador un cierre parece un poco a una muy limitada tipo de objeto. Por otro lado, si desea crear un cierre-como la cosa en Java, entonces usted necesita para crear una base especial de la clase y, a continuación, un nuevo descendiente para cada versión de la clausura. Así que a partir de una funcional del programador el punto de vista de un objeto que parece ser un torpe y mandraulic tipo de cierre.
    • O tal vez los objetos y los cierres de proporcionar la misma funcionalidad y todos somos pobres hombres 😉
    • Su enlace está roto. Le puede dar el nombre real del papel?
    • Yo creo que Pablo J. estaba refiriendo a «Haskell es pasado por alto sistema de objetos», que uno puede llegar aquí de arXiv.org.
    • He editado el comentario para incluir el nombre de papel y enlace, por @caya ‘s comentario útil.

  3. 6

    Tipo de clases son de hecho las únicas construcciones que recuerdan de forma remota en los conceptos OO – en este caso, en las interfaces. Aunque, a diferencia de java, las clases de tipo no son tipos.

    Una cosa buena acerca de las clases de tipo es que no se puede hacer totalmente ajenos, ya existente tipos de miembros de una clase de tipo. Mientras que en java, a veces uno piensa: Estas clases de Un paquete org.a y B de la com.b que estoy usando realmente debería ser la aplicación de la interfaz Y de un tercer paquete, pero no hay manera de hacerlo que no requieren una gran cantidad de código repetitivo, adicional indirections, referencias, etc.

    Por CIERTO, como un anciano programador que me gustaría señalar que «la separación de declaración y de ejecución» tiene de por sí nada que ver con la programación orientada a objetos. Simplemente porque la mayoría de OO-langugaes apoyo no significa que el concepto no era bien conocido por un largo tiempo antes de OO fue inventado. Interesados jóvenes que piensan que la programación antes de que la integración de la OO debe haber sido en una «edad de piedra» nivel puede buscar MODULA, por ejemplo, donde la separación de la declaración y su aplicación no es sólo posible, sino forzada por el lenguaje.

  4. 3

    Una cosa que podría ser bueno mencionar es lentes. Permiten escribir el tipo de a.b.c.d.e «expresión» en un componen-capaz de camino.

    La . puede ser definido para cada estructura de datos. Así que, en cierto sentido, la . es un ciudadano de primera clase en Haskell. Puede ser nombrado, almacenados, dos .-s puede ser compuesto, etc.

Dejar respuesta

Please enter your comment!
Please enter your name here