En una entrevista con John Hughes donde habla sobre Erlang y Haskell, tiene lo siguiente que decir sobre el uso de bibliotecas con estado en Erlang:
Si quiero usar una biblioteca con estado, generalmente construyo una interfaz libre de efectos secundarios encima para que luego pueda usarla de manera segura en el resto de mi código.
¿A qué se refiere con esto? Estoy tratando de pensar en un ejemplo de cómo se vería esto, pero mi imaginación y / o conocimiento me están fallando.
haskell
erlang
state
side-effect
beta
fuente
fuente
Respuestas:
(No conozco a Erlang, y no puedo escribir Haskell, pero creo que puedo responder)
Bueno, en esa entrevista se da el ejemplo de una biblioteca de generación de números aleatorios. Aquí hay una posible interfaz con estado:
La salida puede ser
5 2 7
. Para alguien a quien le gusta la inmutabilidad, ¡esto es simplemente incorrecto! Debería serlo5 5 5
, porque llamamos al método en el mismo objeto.Entonces, ¿cuál sería una interfaz sin estado? Podemos ver la secuencia de números aleatorios como una lista vagamente evaluada, donde
next
realmente recupera la cabeza:Con dicha interfaz, siempre podemos volver a un estado anterior. Si dos partes de su código se refieren al mismo RNG, en realidad obtendrán la misma secuencia de números. En una mentalidad funcional, esto es altamente deseable.
Implementar esto en un lenguaje con estado no es tan complicado. Por ejemplo:
Una vez que agrega un poco de azúcar sintáctica para que parezca una lista, en realidad es bastante agradable.
fuente
Un concepto clave aquí es el de estado mutable externo . Una biblioteca que no tiene un estado mutable externo, es una que está libre de efectos secundarios. Cada función en dicha biblioteca solo depende de los argumentos que se le pasan.
Prácticas pruebas de tornasol que uso:
fuente