Soy nuevo en Haskell, y estoy leyendo acerca de functors y aplicativo functors. Ok, entiendo functors y cómo los puedo usar, pero no entiendo por qué aplicativo functors son útiles y cómo los puedo usar en Haskell. Puede que me explique con un ejemplo sencillo ¿por qué necesito aplicativo functors?

7 Comentarios

  1. 53

    Aplicativo functors son una construcción que proporciona el punto medio entre los functors y las mónadas, y por lo tanto son más extendida de lo que mónadas, mientras más útiles que los functors. Usted puede asignar una función de más de un functor. Aplicativo functors le permitirá tomar un «normal» de la función (tomando no functorial argumentos) lo use para operar en varios de los valores que están en functor contextos. Como corolario, esto le da effectful de programación sin mónadas.

    Un agradable, auto-contenida explicación plagado de ejemplos se pueden encontrar aquí. Usted también puede leer un práctico ejemplo de análisis desarrollado por Bryan O’Sullivan, que no requiere de ningún conocimiento previo.

    • Hay enlaces útiles , pero no creo que pueda sustituir a un breve ejemplo sencillo enfocado a responder a la pregunta, con todos los detalles sin importancia eliminado tanto como sea posible.
  2. 34

    Aplicativo functors son útiles cuando se necesita la secuencia de las acciones, pero no es necesario el nombre de cualquiera de los resultados intermedios. Por lo tanto, están más débiles que las mónadas, pero más fuerte que functors (no de forma explícita se unen operador, pero sí permitir la ejecución arbitraria de funciones dentro de la functor).

    Cuando son útiles? Un ejemplo común es el análisis, donde usted necesita para ejecutar una serie de acciones que leer partes de una estructura de datos en el pedido, a continuación, pegue todos los resultados juntos. Esto es como una forma general de la función composición:

    f a b c d

    donde usted puede pensar de a, b y así como la arbitrariedad de las acciones a ejecutar, y f como el functor de aplicar al resultado.

    f <$> a <*> b <*> c <*> d

    Me gusta pensar en ellos como sobrecargado ‘espacio en blanco’. O, que regular Haskell funciones en la identidad aplicativo functor.

    Ver «Aplicativo de Programación con Efectos«

  3. 12

    Conor McBride y Ross Paterson Funcional De La Perla en el estilo tiene varios buenos ejemplos. Es también responsable de la popularización del estilo en el primer lugar. Se utiliza el término «lenguaje» para «aplicativo functor», pero aparte de eso es bastante comprensible.

  4. 8

    Es difícil encontrar ejemplos en los que usted necesidad aplicativo functors. Puedo entender por qué un intermedio de Haskell programador que les pido yo que se pregunta ya que la mayoría de los textos introductorios presentar casos derivados de las Mónadas utilizando el Aplicativo Functors sólo como una interfaz cómoda.

    La idea clave, como se mencionó, tanto aquí como en la mayoría de las introducciones al tema, es que el Aplicativo Functors están entre los Functors y Mónadas (incluso entre los Functors y Flechas). Todas las Mónadas son Aplicativo Functors pero no todos los Functors son Aplicativo.

    Así necesariamente, a veces podemos utilizar el aplicativo de combinadores para algo que no podemos usar monádico combinadores para. Una cosa es ZipList (ver también esto ASÍ, pregunta por algunos detalles), que es solamente un contenedor de listas con el fin de tener un diferentes Aplicativo instancia que el derivado de la Mónada instancia de la lista. El Aplicativo de la documentación, se utiliza la siguiente línea para dar una idea intuitiva de lo que ZipList es para:

    f <$> ZipList xs1 <*> ... <*> ZipList xsn = ZipList (zipWithn f xs1 ... xsn)

    Como se señaló aquí, es posible hacer peculiar Mónada de las instancias que casi trabajo para ZipList.

    Hay otros Aplicativo Functors que no son Mónadas (ver este ASÍ, pregunta) y son fáciles de encontrar. Tener una Interfaz alternativa para Mónadas es lindo y todo, pero a veces haciendo una Mónada es ineficiente, complicada o incluso imposible, que es cuando se necesidad Aplicativo Functors.


    descargo de responsabilidad: el Hacer Aplicativo Functors también podría ser ineficiente, complicada e imposible, en caso de duda, consulte a su categoría local teórico para el correcto uso del Aplicativo Functors.

  5. 7

    En mi experiencia, Aplicativo functors son grandes, por las siguientes razones:

    Ciertos tipos de estructuras de datos admitir potentes tipos de composiciones, pero realmente no se puede hacer mónadas. De hecho, la mayoría de las abstracciones funcionales reactivos de programación se clasifican en esta categoría. Mientras que podría ser técnicamente capaz de hacer por ejemplo, Behavior (aka Signal) una monada, normalmente no se puede hacer de manera eficiente. Aplicativo functors nos permiten todavía tienen poderosas composiciones sin sacrificar la eficiencia (hay que reconocer que es un poco más complicado de utilizar un aplicativo que una mónada a veces, simplemente porque usted no tiene bastante más que el de la estructura de trabajar).

    La falta de datos de la dependencia en un aplicativo functor permite, por ejemplo, atravesar una acción en busca de todos los efectos que podría producir sin tener los datos disponibles. Así que usted podría imaginar una «web form» aplicativo, se utiliza así:

    userData = User <$> field "Name" <*> field "Address"

    y podría escribir un motor que atravesaría encontrar todos los campos que se utilizan y los muestra en un formulario, a continuación, al obtener los datos de nuevo vuelve a ejecutar para obtener el construido User. Esto no se puede hacer con un simple functor (porque combina dos formas en uno solo), ni una monada, ya que con una mónada se podría expresar:

    userData = do
        name <- field "Name"
        address <- field $ name ++ "'s address"
        return (User name address)

    que no se puede representar, porque el nombre del segundo campo que no puede ser conocido sin ya tener la respuesta de la primera. Estoy bastante seguro de que hay una biblioteca que implementa esta formas idea, ya que he rodado en mi propio un par de veces por el este y ese proyecto.

    La otra cosa buena acerca de aplicativo functors es que componer. Más precisamente, la composición functor:

    newtype Compose f g x = Compose (f (g x))

    es aplicada cuando f y g son. No puede decirse lo mismo de las mónadas, que ha crea toda la mónada transformador de la historia que es complicado en algunas formas desagradables. Aplicativos son super limpio esta manera, y esto significa que usted puede construir la estructura de un tipo que usted necesita por centrarse en los pequeños que se puede componer de los componentes.

    Recientemente el ApplicativeDo extensión ha aparecido en GHC, lo que le permite utilizar do la notación con aplicativos, la flexibilización de algunos de los métodos de representación de la complejidad, siempre y cuando usted no hace ninguna monady cosas.

  6. 6

    Un buen ejemplo: aplicativo de análisis.

    Ver [mundo real haskell] ch16 http://book.realworldhaskell.org/read/using-parsec.html#id652517

    Este es el analizador de código de con-notación:

    -- file: ch16/FormApp.hs
    p_hex :: CharParser () Char
    p_hex = do
      char '%'
      a <- hexDigit
      b <- hexDigit
      let ((d, _):_) = readHex [a,b]
      return . toEnum $ d

    Utilizando functor hacer mucho más corto:

    -- file: ch16/FormApp.hs
    a_hex = hexify <$> (char '%' *> hexDigit) <*> hexDigit
        where hexify a b = toEnum . fst . head . readHex $ [a,b]


    ‘levantar’ puede ocultar los detalles subyacentes de la repetición de algunas código. a continuación, puede utilizar el menor número de palabras para decirle a la exacta & preciso de la historia.

    • Tienes una extraña idea de «más corto» — el aplicativo versión es de 7 caracteres más!
    • Wagner:-_-||, Oh mi.. usted tiene una buena visión de el código, tengo que confesar. Yo en realidad significa ‘vertical más corto’ 🙂
    • Bien, puede ser escrito más corto usando las funciones de Control.Mónada de la biblioteca: char '%' >> liftM (toEnum . fst . head . readHex) (replicateM 2 hexDigit).
    • O, usando el count combinador de Parsec, y de volver a cambiar aplicativo estilo: toEnum . fst . head . readHex <$> (char '%' >> count 2 hexDigit)
  7. 3

    Te recomiendo también echar un vistazo a este

    Al final del artículo hay un ejemplo

    import Control.Applicative
    hasCommentA blogComments =
    BlogComment <$> lookup "title" blogComments
                <*> lookup "user" blogComments
                <*> lookup "comment" blogComments

    Que ilustra varias características del aplicativo estilo de programación.

Dejar respuesta

Please enter your comment!
Please enter your name here