tipos sirve simbolos que para opciones listas hacer funciones ejemplos como basico haskell design-patterns monads

sirve - listas en haskell



¿Dónde puedo aprender Haskell avanzado? (6)

En un comentario a una de mis respuestas , el usuario SO sdcwc esencialmente señaló que el siguiente código:

comb 0 = [[]] comb n = let rest = comb (n-1) in map (''0'':) rest ++ map (''1'':) rest

podría ser reemplazado por:

comb n = replicateM n "01"

que me tenía completamente aturdido.

Ahora estoy buscando un tutorial, libro o PDF que enseñe estos conceptos avanzados. No estoy buscando un tutorial de "¿Qué es una mónada?" Dirigido a principiantes o referencias en línea que expliquen el tipo de replicateM . Quiero aprender a pensar en mónadas y usarlas de manera efectiva, "patrones" monádicos si así lo desea.


Desde mi perspectiva (que ciertamente no es universal), soy indiferente a la mónada de la lista: en su ejemplo, argumentaría (débilmente) que, como hay muchos funcionarios de la lista, fue tan buena como una coincidencia que la solución era Un funcional monádico en lugar de solo un funcional de lista (o una generalización de un funcional de lista a través de Data.Traversable o Data.Foldable).

Para patrones monádicos, pienso más en el efecto que en los combinadores particulares: modelos de estado de lectura y escritura, modelos de lectura de "solo lectura", modelos de Writer que solo escriben "estado", modelos de parcialidad (por lo que puede modelar errores sin mensajes de error) , O bien / Error modela errores con códigos de error tangibles o mensajes. A medida que adquiera los efectos, se dará cuenta rápidamente de que necesita combinarlos para que los transformadores de mónada sean importantes.

Aún no hay libros sobre el avanzado Haskell, excepto "La diversión de la programación". Este es un libro de varios autores que recopila algunos trabajos bastante diferentes, por lo que vale la pena buscar una copia antes de decidir si es un libro que desearía o no. . El nuevo libro de Richard Bird tiene muchos ejemplos de codificación avanzada, pero lo hace con un código simple y elegante. Es un libro muy bueno, aunque no es un libro sobre características avanzadas de lenguaje.

En ausencia de libros, los papeles son el mejor lugar, ya que están más pulidos que los blogs. Lo más relevante es el Simposio de Haskell (que solía llamarse Taller de Haskell), revise el enlace a continuación para ver los procedimientos que enumerarán los documentos presentados, luego realice una búsqueda de cualquier cosa que le parezca interesante: en la mayoría de los casos, los autores publican el documento. disponible.

http://haskell.org/haskell-symposium/


Dos buenas fuentes para que aprenda sobre los buenos conceptos del lenguaje de Haskell han sido http://learnyouahaskell.com/ y http://www.realworldhaskell.org/blog/ que puede usar en línea y de forma gratuita.) Espero que puedan darte algunos buenos pasos más allá. Incluso cuando no enseñan los conceptos más avanzados, pueden darte una buena idea de lo que hay y lo que podría ser útil.


Este fragmento de código en realidad combina dos hechos bastante implícitos sobre Haskell:

  • Que las cadenas son por defecto listas de caracteres.
  • Estas listas son una implementación de la mónada de indeterminismo, que enumera todas las rutas posibles cuando se combinan.

Las siguientes piezas de código son equivalentes:

replicateM n "12" replicateM n [''1'', ''2''] replicateM n $ do c <- [''1'', ''2''] return c

Yo diría que la última versión en realidad muestra de manera más clara lo que sucede en este caso: que tenemos una opción entre ''1'' y ''2'' y que n de estas opciones están encadenadas. Una vez que entiendes eso, eres tan avanzado en tu comprensión de Haskell como necesitas ser. El resto es solo un poco de ofuscación.


Lo realmente salvaje / impresionante de las mónadas es cuando te mueves más allá de la mónada estatal y sus subconjuntos (escritor y lector) y empiezas a pensar en Cont y List, y lo que significan en términos de retroceso, combinación y búsqueda. Daré más referencias más adelante, pero el documento LogicT de Oleg y Chung-chieh Shan es un buen comienzo: http://okmij.org/ftp/Computation/monads.html

Las aventuras de EZ Yang en tres mónadas de MR 15: http://themonadreader.files.wordpress.com/2010/01/issue15.pdf

Las respuestas a esta pregunta también pueden ser de interés: Usos creativos de las mónadas.


Mira en la Typeclassopedia en TMR13 . Nadie más lo ha sugerido, y me ha ayudado a pensar acerca de los diversos tipos de clases que Haskell ofrece inmensamente.

Nota: se está actualizando a una segunda edición , pero la primera edición sigue siendo relevante e informativa.


Tome funciones como sequence , filterM , liftM2 , join y piense cómo funcionan para cada mónada IO , [] , (->) a , Writer , State . Por ejemplo, la sequence de la mónada IO ejecuta las acciones IO de forma secuencial:

[IO a] -> IO [a]

Escribe la firma y trata de usarlos. Algunas combinaciones son interesantes, otras menos.

Ejemplo para filtro:

{-# LANGUAGE NoMonomorphismRestriction #-} import Control.Monad import Control.Monad.State import Control.Monad.Reader a = filterM (/x -> do putStrLn $ "Put " ++ show x ++ "?" fmap (=="Y") getLine) b = filterM (const [False,True]) c m xs = runState (filterM k xs) 0 where k x = do a <- get let p = a + x <= m when p $ put (a+x) return p d = filterM (flip id)

a filtra la lista utilizando IO: pregunta al usuario sobre cada elemento.

b filtra la lista de manera no determinista: cada elemento se incluye de forma no determinista y no se incluye. Como resultado, obtienes powerset. (¡Intentalo!)

c Filtra la lista, manteniendo el estado. En este caso, se trata de una mochila codiciosa: tiene una mochila de capacidad m y desea insertar tantos elementos de xs .

d filtra la lista, manteniendo un estado de solo lectura. Esto no es interesante. Utilicé la función de filtrado como el estado, y esto le da un flip filter .

Una sola función filterM puede hacer todas esas cosas.

Si escribirá un código similar para otras funciones, obtendrá suficiente intuición para notar funciones monádicas en otros lugares. Por ejemplo, ¿cómo obtener la siguiente función?

dup f x = f x x

y que hay de dup'' fx = fxxx ?