recursion anonymous-function elixir

recursion - Recursión y funciones anónimas en elixir



anonymous-function (4)

Aquí hay un combinador fijo (Y):

fix = fn f -> (fn z -> z.(z) end).(fn x -> f.(fn y -> (x.(x)).(y) end) end) end

Así es como lo usa:

factorial = fn factorial -> fn 0 -> 0 1 -> 1 number -> number * factorial.(number - 1) end end fix.(factorial).(6) # 720

Solo funciona con funciones que se repiten con 1 argumento. Elixir no tiene argumentos variables. Para admitir argumentos múltiples, deberá agregar más argumentos que el simple y like: f.(fn a,b -> (x.(x)).(a,b) end) .

Intento definir una función anónima para hacer un producto de punto, puedo codificar esto como una función privada sin ningún problema, pero estoy luchando con la sintaxis de la función anónima. Sé que podría implementar esto de manera diferente, pero estoy tratando de entender cómo definir funciones anónimas con coincidencia de patrones y recursión. Esta es mi implementación actual

dot = fn [i|input],[w|weights], acc -> dot.(input,weights,i*w+acc) [],[bias],acc -> acc + bias end

Y obtengo este error en la compilación:

function dot/0 undefined

¿Algún consejo? ¿Esto simplemente no es posible?


El enfoque menos formal pero aún aceptable es:

factorial = fn (0,_) -> 1 (1,_) -> 1 (n, fun) -> n * fun.(n - 1, fun) end

Usted lo llama con factorial.(6, factorial) # 720


No es posible recurrir a funciones anónimas en Elixir.

Erlang 17 (actualmente un candidato de lanzamiento) agrega esta posibilidad a Erlang y planeamos aprovecharla pronto. En este momento, el mejor enfoque es definir una función de módulo y pasarla:

def neural_bias([i|input],[w|weights], acc) do neural(input,weights,i*w+acc) end def neural_bias([], [bias], acc) do acc + bias end

Y entonces:

&neural_bias/3


Podría definir una función de módulo llamada fix , y usarla más tarde para definir dot (y cualquier otra función anónima recurrente):

defmodule A do def fix(f, x) do f.(fn(x) -> fix(f, x) end, x) end def fix2(f, x, y) do f.(fn(x, y) -> fix2(f, x, y) end, x, y) end end dot = fn(x, y) -> A.fix2(fn dot, [i|input],[w|weights], acc -> dot.(input,weights,i*w+acc) dot, [],[bias],acc -> acc + bias end, x, y) end