Estoy comenzando a aprender programación funcional con elixir y leí una respuesta suya donde critica que implementaron despacho dinámico, supongo que se refiere a los "Protocols" ¿Cuál sería la alternativa o enfoque funcional que debería tomar para este caso?
Los protocolos de Elixir son una imitación (con otro nombre) del despacho dinámico de lenguajes Orientados Objetos, injertado en las llamadas de funciones.
El mecanismo de protocolos de Elixir, en efecto, termina haciendo despacho dinámico: el programa tiene que correr y al llegar al punto de la llamada *decidir* a cuál función particular llamar. Lo hace para todos los casos. Sólo para que quede muy claro: eso es *lento* y puede causar errores a tiempo de ejecución en determinadas circunstancias que no son inusuales en programas concurrentes. Por otro lado, tiene que ver con el hecho de correr sobre una máquina virtual (BEAM) cuya noción de tipos requiere verificación dinámica.
No lo pueden hacer mejor, porque no están sobre una plataforma que les permita hacerlo mejor. Están tratando de emular una operación que viene de Orientación a Objetos, sobre una máquina virtual dinámica.
El enfoque puramente funcional con un sistema de tipos completo es utilizar Polimorfismo Paramétrico (como en Haskell), que permite tomar esa decisión a tiempo de compilación para todos los casos en los que se pueda, generando código de *máquina* que llame directamente a la rutina que hace falta.
El sistema de tipos de Elixir es dinámico y un poco mejor que el de Erlang, pero está muy lejos de (y no puede avanzar hasta) el de Haskell por la plataforma subyacente. Es mejor que Erlang y mejor que usar cualquiera de los lenguajes mixtos «populares», pero hasta ahí.
Es similar a la relación entre Scala y Java: la mayor limitación es la JVM, una máquina de pila con muy pocas oportunidades de optimización y la obligación de incluir verificaciones dinámicas..
El mecanismo de protocolos de Elixir, en efecto, termina haciendo despacho dinámico: el programa tiene que correr y al llegar al punto de la llamada *decidir* a cuál función particular llamar. Lo hace para todos los casos. Sólo para que quede muy claro: eso es *lento* y puede causar errores a tiempo de ejecución en determinadas circunstancias que no son inusuales en programas concurrentes. Por otro lado, tiene que ver con el hecho de correr sobre una máquina virtual (BEAM) cuya noción de tipos requiere verificación dinámica.
No lo pueden hacer mejor, porque no están sobre una plataforma que les permita hacerlo mejor. Están tratando de emular una operación que viene de Orientación a Objetos, sobre una máquina virtual dinámica.
El enfoque puramente funcional con un sistema de tipos completo es utilizar Polimorfismo Paramétrico (como en Haskell), que permite tomar esa decisión a tiempo de compilación para todos los casos en los que se pueda, generando código de *máquina* que llame directamente a la rutina que hace falta.
El sistema de tipos de Elixir es dinámico y un poco mejor que el de Erlang, pero está muy lejos de (y no puede avanzar hasta) el de Haskell por la plataforma subyacente. Es mejor que Erlang y mejor que usar cualquiera de los lenguajes mixtos «populares», pero hasta ahí.
Es similar a la relación entre Scala y Java: la mayor limitación es la JVM, una máquina de pila con muy pocas oportunidades de optimización y la obligación de incluir verificaciones dinámicas..