2010-05-03 18 views
21

¿Alguien sabe de una biblioteca de estructura de datos C++ que proporciona equivalentes funcionales (a.k.a., inmutables o "persistentes" en el sentido FP) de las estructuras STL familiares?Estructuras de datos funcionales en C++

Por "funcional" me refiero a que los objetos en sí mismos son inmutables, mientras que las modificaciones a esos objetos devuelven nuevos objetos que comparten los mismos elementos internos que el objeto principal en su caso.

Idealmente, una biblioteca así se asemejaría a STL, y funcionaría bien con Boost.Phoenix (advertencia- Realmente no he usado Phoenix, pero hasta donde puedo decirlo proporciona muchos algoritmos pero no estructuras de datos, a menos que el cambio calculado de forma perezosa a una estructura de datos existente cuenta - ¿verdad?)

+0

¿No podría obtener aproximadamente el efecto requerido pasando y devolviendo todos los objetos por valor? –

+4

Solo si pudiera soportar el rendimiento y la sobrecarga de memoria. El truco con las estructuras de datos funcionales es que comparten elementos internos siempre que sea posible. Esto es seguro de hacer porque los objetos son inmutables, y tiene mucha menos memoria y procesador de lo que está volviendo por valor en estructuras de datos de gran tamaño. – drg

+6

Me interesé sinceramente en la misma pregunta mientras escribía el informe de experiencia en http://portal.acm.org/citation.cfm?id=1596591. Mi conclusión en ese momento era que realmente necesita recolección de basura: la ventaja de la estructura persistente es compartir, pero en presencia de compartir ya no hay una propiedad clara de ningún nodo, por lo que algún tipo de autoridad central (el GC) tiene que decidir qué nodos se pueden reclamar. Eso, o no importa para su aplicación, que los nodos solo se asignan y nunca se liberan. –

Respuesta

3

Miraría y vería si FC++ desarrollado por Yannis Smaragdakis incluye cualquier estructura de datos. Ciertamente, este proyecto más que cualquier otro se trata de apoyar un estilo funcional en C++.

+0

Parece una biblioteca interesante, aunque no tiene actividad reciente. Existe un tipo de datos de lista persistente, pero no parece ser bueno para uso general fuera de FC++. – drg

1

Esto es más que una respuesta detallada, pero Bartosz Milewski parece haber trabajado mucho en esto. Véase, por ejemplo:

http://bartoszmilewski.com/2013/11/13/functional-data-structures-in-c-lists/

parece que ha implementado una gran cantidad de algoritmos del libro de Okasiki Estructuras de datos puramente funcionales aquí:

https://github.com/BartoszMilewski/Okasaki

N. B. Aún no lo he probado, pero son las primeras estructuras de datos persistentes de C++ que he visto fuera de FC++.

Con suerte, voy a intentarlos pronto.

+0

Parece que faltan partes importantes ... como la eliminación – Michael