functional-programming - que - rust lenguaje español
¿Soporta/Will Rust los lenguajes de programación funcional? (2)
Un lenguaje debe tener "tipos de tipo más alto" para admitir conceptos como Functors, Applicatives y Monads. En otras palabras, el lenguaje debe poder abstraerse sobre tipos que son * -> *, o funciones de tipo a tipo. Rust no soporta actualmente este nivel de abstracción. Se ha discussed como una posible dirección futura, pero no espero que sea un enfoque pronto.
A medida que se oxida Rust, cada vez más, mi interés en él comienza a despertar. Me encanta el hecho de que sea compatible con tipos de datos algebraicos y, en particular, con la comparación de ellos, pero ¿hay algún pensamiento en otros idiomas funcionales?
Por ejemplo, ¿hay una colección de las funciones estándar de filtro / mapa / reducción en la biblioteca estándar y, lo que es más importante, puede encadenar / componer de una manera sintáctica agradable [1]?
Dado que ya existen medios elegantes para el uso de ADT, ¿qué hay de las mónadas, en particular un poco de azúcar sintáctica para ellos?
[1] Haskell consiguió (.) Y (>>>), métodos de extensión C # y, opcionalmente, LINQ, D tiene una sintaxis de llamada de función unificada.
El óxido no tiene HKT, pero sus iteradores admiten la codificación en un estilo funcional con funciones de orden superior (HOF) como map
, filter
, fold
, etc., con un encadenamiento conveniente.
Los detalles difieren en comparación con los lenguajes funcionales, que generalmente se recolectan en la basura, mientras que los programas Rust tratan la gestión de la memoria de una manera determinista, similar a C ++ RAII, como parte del flujo del programa.
Para permitir un encadenamiento eficiente, las HOF individuales devuelven las plantillas de expresión perezosa compacta, y puede convertir el resultado final en datos (asignación y evaluación en un solo paso) terminando con .to_owned_vec()
o .collect()
o lo que sea.
En algunas situaciones, esto no es necesario, la expresión-plantilla devuelta es un iterador en sí mismo y eso podría ser suficiente. Por ejemplo, puede iterar sobre eso con un bucle for
, o pasarlo como un argumento a una función genérica.
Ver:
Patrones similares son posibles tanto en C ++ 11 (con bibliotecas adicionales) como en Rust. Los genéricos de Rust no son tan poderosos como las plantillas C ++, pero la inmutabilidad por defecto, la sintaxis orientada a la expresión, las lambdas polimórficas y la inferencia de tipo bidireccional le dan una sensación un poco más cercana a un lenguaje funcional.
Con respecto a los ''métodos de extensión'' y la sintaxis de llamada uniforme, Rust permite una forma similar de ''mundo abierto'' para organizar el código. Puede agregar impl
con más métodos para cualquier tipo dentro de una biblioteca o programa, o ampliar los tipos existentes de otras bibliotecas implementando los métodos de sus propios rasgos en ellos.
Esto facilita el uso del estilo de llamada del método chainable que en C ++ (es decir, menos necesidad de modificar o derivar tipos).
Tenga en cuenta que muchos de los modismos de Haskell tienen que ver con la pureza (p. Ej., La mónada IO, las lentes ...), y Rust es multiprotigma, no funcional puro. Puede tener una función pura para los beneficios de la transparencia referencial en el nivel del programa y, sin embargo, su implementación se simplifica mediante variables locales mutables.