2010-03-14 24 views
12

¿Sabes si hay punteros en Haskell?¿Haskell tiene punteros?

  • En caso afirmativo: ¿cómo se usan? ¿Hay algún problema con ellos? ¿Y por qué no son populares?

  • Si no: ¿hay alguna razón para ello?

+0

Ver también http://stackoverflow.com/questions/2386210/how-to-get-a-pointer-value-in-haskell –

Respuesta

19

Sí hay. Eche un vistazo a Foreign.Ptr o Data.IORef

Sospecho que esto no es lo que está pidiendo. Como Haskell es en su mayor parte sin estado, significa que los punteros no encajan en el diseño del idioma. Tener un puntero a la memoria fuera de la función significaría que una función ya no es pura y que solo permite que los punteros a valores dentro de la función actual sean inútiles.

+19

Sospecho que está buscando una manera de pasar estructuras de datos grandes sin crear copias , basado en la suposición errónea de que pasar un valor a una función crea una copia como lo hace al hacer call-by-value en C++. – sepp2k

+0

@ sepp2k o para hablar con dispositivos mapeados en memoria. –

12

Haskell proporciona punteros a través de la extensión de la interfaz de función externa. Mire, por ejemplo, Foreign.Storable.

Los punteros se utilizan para interoperar con el código C. No para la programación de Haskell todos los días.

Si estás buscando referencias - punteros a objetos que desea mutar - hay STRef y IORef, que sirven a muchos de los mismos usos que los punteros. Sin embargo, rara vez, si alguna vez, necesita Refs.

7

Si simplemente desea evitar copiar valores grandes, como sepp2k supone, no necesita hacer nada: en la mayoría de las implementaciones, todos los valores no triviales se asignan por separado en un montón y se refieren entre sí por direcciones de nivel de máquina (es decir, punteros). Pero una vez más, no necesita hacer nada al respecto, se ocupa de usted.

Para responder a su pregunta sobre cómo se pasan los valores, se pasan de la forma que la implementación lo considere oportuno: dado que no puede mutar los valores de ninguna manera, no afecta el significado del código (siempre que el rigor se respeta); por lo general, esto funciona por necesidad a menos que esté pasando, p. ej. Los valores de Int que el compilador puede ver ya han sido evaluados ...

Pass-by-need es como pasar por referencia, excepto que cualquier referencia dada podría referirse a un valor evaluado real (que no se puede cambiar) , o a un "thunk" para un valor aún no evaluado. Wikipedia tiene more.

+0

Este es uno de los principales puntos fuertes de Haskell: debe hacer muy poco para garantizar la eficiencia en la mayoría de los casos. – avpx

Cuestiones relacionadas