tipos reales opciones numeros numero monadas leer impresion hacer functores funciones ejemplos como aleatorios haskell

opciones - reales en haskell



¿Cuál es el siguiente paso para aprender Haskell después de las mónadas? (9)

Poco a poco he ido aprendiendo Haskell, e incluso siento que tengo un montón de mónadas. Sin embargo, todavía hay muchas cosas más exóticas que apenas entiendo, como Flechas, Aplicativo, etc. Aunque estoy recogiendo partes del código de Haskell que he visto, sería bueno encontrar un tutorial que realmente explique ellos completamente (Parece que hay docenas de tutoriales sobre mónadas ... ¡pero todo parece terminar justo después de eso!)


Comience a escribir el código. Aprenderás conceptos necesarios sobre la marcha.

Más allá del lenguaje, para usar Haskell de manera efectiva, debes aprender algunas herramientas y técnicas del mundo real. Cosas para considerar:

  • Cabal , una herramienta para gestionar dependencias, crear e implementar aplicaciones Haskell * .
  • FFI (Foreign Function Interface) para usar las librerías C de tu código Haskell ** .
  • Hackage como fuente de las bibliotecas de otros.
  • Cómo perfilar y optimizar
  • Marcos de prueba automáticos (QuickCheck, HUnit).

*) cabal-init ayuda a comenzar rápidamente.

**) Actualmente, mi herramienta favorita para enlaces FFI es bindings-DSL .


Como único paso siguiente (en lugar de media docena de "próximos pasos"), le sugiero que aprenda a escribir sus propias clases de tipos. Aquí hay un par de problemas simples para que comiences:

  • Escribir algunas declaraciones de instancias interesantes para QuickCheck. Digamos, por ejemplo, que desea generar árboles aleatorios que de alguna manera sean "interesantes".

  • Pase al siguiente pequeño problema: defina las funciones // , // y el complement ("y", "o", & "no") que se pueden aplicar no solo a booleanos sino a predicados de aridad arbitraria. (Si miras detenidamente, puedes encontrar la respuesta a esta en SO).


De lejos, lo más importante que puede hacer es explorar más de Hackage. Atacar con las diversas características exóticas de Haskell quizás le permita encontrar soluciones mejoradas para ciertos problemas, mientras que las bibliotecas de Hackage expandirán enormemente su conjunto de herramientas.

La mejor parte del ecosistema de Haskell es que puedes equilibrar aprendiendo nuevas técnicas de abstracción quirúrgicamente precisas con el aprendizaje de cómo usar las sierras vibratorias gigantes disponibles para ti en Hackage.


En cuanto a las clases de tipos:

  • Applicative es realmente más simple que Monad . Recientemente he dicho algunas cosas al respecto en otros lugares, pero la esencia es que se trata de funciones mejoradas en las que puedes levantar funciones. Para tener una idea de Applicative , podría intentar escribir algo usando Parsec sin utilizar la notación do mi experiencia ha sido que el estilo aplicativo funciona mejor que monadic para analizadores directos.

  • Arrow son una forma muy abstracta de trabajar con cosas que son como funciones ("flechas" entre tipos). Pueden ser difíciles de entender hasta que tropieces con algo que es naturalmente parecido a una Arrow . En un momento reinventé la mitad de Control.Arrow (mal) mientras escribía máquinas de estado interactivas con ciclos de retroalimentación.

  • No lo mencionaste, pero una clase de tipo muy subestimado y poderoso es el humilde Monoid . Hay muchos lugares donde se puede encontrar una estructura de tipo monoide. Eche un vistazo al paquete monoids , por ejemplo.

Además de las clases de tipo, ofrecería una respuesta muy simple a tu pregunta: ¡ escribe programas! La mejor manera de aprender es haciendo, así que elija algo divertido o útil y simplemente haga que suceda.

De hecho, muchos de los conceptos más abstractos, como Arrow probablemente tendrán más sentido si vuelves a ellos más tarde y descubres que, como yo, ofrecen una solución ordenada a un problema que has encontrado pero que no tuvo incluso se dio cuenta que podría abstraerse.

Sin embargo, si quieres algo específico para tirar, ¿por qué no echar un vistazo a la Programación Reactiva Funcional? Esta es una familia de técnicas que prometen mucho, pero hay muchas preguntas abiertas sobre cuál es la mejor manera de hacerlo. es.


Escribe un compilador haskell :-).


Estos son algunos de los recursos que he encontrado útiles después de "obtener la mía" de las mónadas:

  • Como señaló SuperBloup, la Typeclassopedia Brent Yorgey es indispensable (y de hecho cubre las flechas).
  • Hay un montón de cosas geniales en Real World Haskell que podrían considerarse "después de las mónadas": análisis sintáctico, transformadores de mónada y STM, por ejemplo.
  • "Generalizing Monads to Arrows" de John Hughes es un gran recurso que me enseñó tanto sobre las mónadas como sobre las flechas (aunque pensé que ya entendía las mónadas cuando las leía).
  • El documento "Yampa Arcade" es una buena introducción a la Programación Reactiva Funcional.
  • En las familias de tipos: he encontrado que trabajar con ellos es más fácil que leer sobre ellos. El paquete vector-space es un lugar para comenzar, o puede ver el código de Oleg Kiselyov y el curso de Ken Shan sobre Haskell y la semántica del lenguaje natural .
  • Elija un par de capítulos de Estructuras de datos puramente funcionales de Chris Okasaki y resuélvalos en detalle.
  • Raymond Smullyan To Mock a Mockingbird es una introducción fantásticamente accesible a la lógica combinatoria que cambiará la forma en que escribes Haskell.
  • Lea Functional Pearl de Gérard Huet en cremalleras . El código es OCaml, pero es útil (y no demasiado difícil) poder traducir OCaml a Haskell en tu cabeza cuando trabajas en documentos como este.

Lo más importante es profundizar en el código de cualquier biblioteca de Hackage que encuentre usando. Si están haciendo algo con sintaxis o modismos o extensiones que no comprendes, búscalo.


Las clases de tipos como Monad, Applicative , Arrow , Functor son geniales y todas, y aún más geniales para cambiar la forma en que piensas del código que necesariamente la conveniencia de tener funciones genéricas sobre ellas. Pero existe un concepto erróneo común de que el "siguiente paso" en Haskell es aprender sobre más clases de tipos y formas de estructurar el flujo de control. El siguiente paso es decidir qué desea escribir e intentar escribirlo, explorando lo que necesita a lo largo del camino.

E incluso si entiendes las Mónadas, eso no significa que hayas arañado la superficie de lo que puedes hacer con un código monádicamente estructurado. Juega con las bibliotecas de combinador de analizadores, o escribe las tuyas propias. Explore por qué la notación aplicativa a veces es más fácil para ellos. Explore por qué limitarse a analizadores aplicativos puede ser más eficiente.

Observe los problemas lógicos o matemáticos y explore las formas de implementar el rastreo retroactivo: primero en profundidad, primero en amplitud, etc. Explore la diferencia entre ListT y LogicT y ChoiceT. Eche un vistazo a las continuaciones.

O haz algo completamente diferente!


Usted sabe todo lo que necesita para avanzar y escribir el código. Pero si está buscando más cosas de Haskell-y para aprender, le sugiero:

  • Escriba familias. Característica muy útil. Básicamente, le permite escribir funciones en el nivel de tipos, lo cual es útil cuando intenta escribir una función cuyos parámetros son polimórficos de una manera muy precisa. Un tal ejemplo:

data TTrue = TTrue data FFalse = FFalse

class TypeLevelIf tf a b where type If tf a b weirdIfStatement :: tf -> a -> b -> tf a b

instance TypeLevelIf TTrue a b where type If TTrue a b = a weirdIfStatement TTrue a b = a

instance TypeLevelIf FFalse a b where type If FFalse a b = b weirdIfStatement FFalse a b = a

Esto le da una función que se comporta como una instrucción if , pero puede devolver diferentes tipos en función del valor de verdad que se le da.

Si tiene curiosidad acerca de la programación a nivel de tipo, las familias de tipo proporcionan una avenida en este tema.

  • Plantilla Haskell. Este es un gran tema. Le da un poder similar a las macros en C, pero con mucha más seguridad tipo.

  • Aprende sobre algunas de las principales bibliotecas de Haskell. No puedo contar cuántas veces Parsec me ha permitido escribir rápidamente una utilidad insanamente útil. dons publica periódicamente una lista de bibliotecas populares en hackage; compruébalo .