Solo sé F #. No he aprendido otros lenguajes de programación funcionales. Todos los ejemplos que he visto para las mónadas solo describen los métodos de unión y unidad. F # tiene muchas palabras clave (por ejemplo, let!
, do!
, etc.) que le permiten hacer cosas diferentes dentro de la misma expresión computacional. Esto aparentemente le da más poder que sus métodos básicos de unión y unidad. ¿Esto es exclusivo de F # o es común en los lenguajes de programación funcionales?¿La implementación de mónadas de F # es única con respecto a la cantidad de palabras clave disponibles para ella?
Respuesta
Sí, creo que la sintaxis de F # para expresiones de cálculo es única, ya que proporciona soporte sintáctico directo para diferentes tipos de cálculos. Se puede usar para trabajar con monoids, mónadas y también MonadPlus cálculos de Haskell.
Escribí sobre esto en la introducción de my Master thesis. Creo que es una parte bastante legible, por lo que puede ir a la página 27 para leerla. De todos modos, voy a copiar los ejemplos aquí:
Monoid se utiliza sólo para la concatenación de valores mediante alguna operación "+" (Combine
). Se puede utilizar por ejemplo para la construcción de cadenas (esto es ineficiente, pero demuestra la idea):
type StringMonoid() =
member x.Combine(s1, s2) = String.Concat(s1, s2)
member x.Zero() = ""
member x.Yield(s) = s
let str = new StringMonoid()
let hello = str { yield "Hello "
yield "world!" };;
Mónadas son el ejemplo familiar que utiliza unen y retorno operaciones de expresiones comptuation. Por ejemplo tal vez mónada representa cálculos que pueden fallar en cualquier punto:
type MaybeMonad() =
member x.Bind(m, f) =
match m with Some(v) -> f v | None -> None
member x.Return(v) = Some(v)
let maybe = new MaybeMonad()
let rec productNameByID() = maybe {
let! id = tryReadNumber()
let! prod = db.TryFindProduct(id)
return prod.Name }
mónadas aditivos (aka MonadPlus
en Haskell) es una combinación de los dos. Es un poco como el cálculo monádico que puede producir valores múltiples. Un ejemplo común es lista (o secuencia), que puede implementar tanto bind y combinan:
type ListMonadPlus() =
member x.Zero() = []
member x.Yield(v) = [v]
member x.Combine(a, b) = a @ b
member x.Bind(l, f) = l |> List.map f |> List.concat
let list = new ListMonadPlus()
let cities = list {
yield "York"
yield "Orleans" }
let moreCities = list {
let! n = cities
yield n
yield "New " + n }
// Creates: [ "York"; "New York"; "Orleans"; "New Orleans" ]
Hay algunas palabras clave adicionales que no corresponden directamente a cualquier idea teórica. La palabra clave use
se ocupa de los recursos y for
y while
se puede utilizar para implementar el bucle. La secuencia/lista de comprensión realmente usa for
en lugar de let!
, porque tiene mucho más sentido desde el punto de vista sintáctico (y for
generalmente toma una secuencia, aunque puede ser, por ejemplo, asíncrona).
Las mónadas se definen en términos de operaciones bind
y unit
(solo). Existen otras estructuras definidas por otras operaciones (por ejemplo, en Haskell, la clase de tipo MonadPlus tiene operaciones zero
y plus
, que corresponden a Zero
y Combine
en expresiones de cálculo F #). Hasta donde yo sé, los creadores de cálculos de F # son únicos en términos de proporcionar una sintaxis agradable para la amplia gama de operaciones que admiten, pero la mayoría de las operaciones no están relacionadas con las mónadas.
F # binding forms que terminan en !
denot expresiones de cálculo, incluyendo let! use! do! yield! return!
.
let! pat = expr in comp-expr -- binding computation
do! expr in comp-expr -- sequential computation
use! pat = expr in comp-expr -- auto cleanup computation
yield! expr -- yield computation
return! expr -- return computation
expresiones Computación se utilizan "para las secuencias y otras interpretaciones no estándar de la expresión de sintaxis F #". Estas formas de sintaxis ofrecen formas de sobrecargar esa sintaxis, por ejemplo, para codificar cómputos monádicos, o cálculos monoidales, y parecen ser similares a, p. la notación do de Haskell y las correspondientes formas de enlace (no mágicas) en ese idioma.
Por lo tanto, diría que admiten una sobrecarga de sintaxis para admitir otras interpretaciones de la sintaxis de expresión del idioma, y esto tienen en común con muchos lenguajes, incluidos Haskell y OCaml. Sin duda es una característica de lenguaje útil y útil.
Referencias:The F# 2.0 Language Specification.
(Recuérdese de la memoria, que puede estar apagada.)
Aunque creo que unit
y bind
son la base típico de las mónadas, creo que tal vez map
y join
de una base diferente que he visto en trabajos académicos . Esto es un poco como funciona LINQ en C# y VB, donde la sintaxis from
varia en Select
o SelectMany
que son similares a map
y join
. LINQ también tiene algunas palabras clave 'adicionales', un poco como F # aunque más ad hoc (y más adecuadas para consultar enumeraciones/bases de datos).
No conozco otros lenguajes funcionales como F # que efectivamente "elevan" la mayor parte del flujo de control y otras sintaxis a mónadas (bueno, "expresiones de cálculo", que pueden ser o no mónadas).
Por lo que vale, la base "canónica" sería los tres de mapa, unidad y unión; todos son distintos y ortogonales y el resultado es matemáticamente agradable. La operación "vincular" es un mapa compuesto + combinación que solo existe porque es conceptualmente más conveniente para la programación con mónadas; en el caso de LINQ, imagine hacer todo con solo 'Seleccionar' y' Concat' en lugar de 'SeleccionarMany'. –
- 1. Con respecto a la programación orientada a objetos F #
- 2. usando mónadas para hacer transformaciones no disponibles a granel?
- 3. ¿Debo usar palabras clave propias (propiedades) en la implementación?
- 4. F # - ¿Qué es la palabra clave "eso"?
- 5. F #: ¿Es necesaria la palabra clave "divertida"?
- 6. Seleccionar una gran cantidad de filas con la clave principal
- 7. Definición de palabras clave nuevas en la expresión de cálculo de F #
- 8. ¿Cuál es la diferencia entre la clave principal y la restricción de clave única?
- 9. Jackson: ¿cómo especificar una implementación única para la deserialización con referencia a la interfaz?
- 10. ¿Cuál es la diferencia entre los argumentos con valores predeterminados y argumentos de palabras clave?
- 11. Creando la clave única de MongoDB con C#
- 12. Generación de clave única
- 13. Mongoose se duplica con la clave de esquema única
- 14. ¿Cuál es la solución óptima para la coincidencia de etiquetas/palabras clave?
- 15. Cómo guardar etiquetas/palabras clave de la matriz a la base de datos con php?
- 16. ¿Cuál es la mejor respuesta para la búsqueda de la máxima cantidad posible de una matriz
- 17. ¿De qué versión de Linux kernel/libc es Java Runtime.exec() seguro con respecto a la memoria?
- 18. delegado de palabras clave frente a la notación lambda
- 19. ¿Cuál es la sintaxis de F # para "no igual a"?
- 20. implementación de las funciones de cálculo, es decir, f (x), en la programación
- 21. confusión con respecto a la pereza
- 22. matriz de búsqueda ruby para palabras clave
- 23. ¿Es posible usar la implementación de clic una vez con F #?
- 24. Con respecto a mark-sweep (enfoque lento) para la recolección de basura en C++?
- 25. ¿Cuál es el equivalente en F # de la palabra clave predeterminada de C#?
- 26. ¿La clave única del servidor Sql también es un índice?
- 27. CouchDB - Consulta de valor clave de la matriz para el primer elemento clave única
- 28. clave única en toda la tabla mysql?
- 29. Palabras clave de bloqueo de fuente: resaltar la subexpresión múltiple
- 30. ¿Cuál es la cantidad máxima de filas que puede almacenar una única tabla de SQL Server?
Tomas, el enlace a su artículo anterior ya no funciona. Aquí está el nuevo enlace, http://tomasp.net/academic/theses/events/events.pdf. – kimsk