Tengo una pregunta, quiero hacer la adición de 2 matrices por fila en erlang, estoy tratando de aplicar el código para Haskell:

add :: Num a => [[a]] -> [[a]] -> [[a]]
add = zipWith $ zipWith (+)

Hice algo como esto:

add([[]],[[]]) -> []
add = zipWith $ zipWith (+)

Pero aparece un error, con el $, estoy realmente confundido. ¿Cómo puedo hacer esto en erlang?

Y funciona de esta manera:

  add([[ 1, 2 ],[ 3 , 4 ]] , [[ 4 , 5 ],[ 6 , 7 ]] ).

Resultado:

[[ 6, 8], [ 10, 12]]
0
Luiz Miranda 13 nov. 2017 a las 21:33

2 respuestas

La mejor respuesta

Esta es la traducción de la dirección de su función Haskell a Erlang:

add(Xss, Yss) ->
  lists:zipwith(fun(Xs, Ys) -> lists:zipwith(fun(X, Y) -> X + Y end, Xs, Ys) end, Xss, Yss).

(+) se convierte en fun(X, Y) -> X + Y end y dado que Erlang no tiene nada como el operador $ o la aplicación parcial automática de funciones, necesitamos nombrar todos los argumentos y pasarlos explícitamente a lists:zipwith .

Funciona como se esperaba:

1> a:add([[1,2],[3,4]],[[4,5],[6,7]]) == [[5, 7], [9, 11]].
true
3
Dogbert 15 nov. 2017 a las 12:50
1> shell:strings(false).            
true
2> AddRow = fun(X, Y) -> lists:zipwith(fun erlang:'+'/2, X, Y) end.
#Fun<erl_eval.12.99386804>
3> Add = fun(X, Y) -> lists:zipwith(AddRow, X, Y) end.             
#Fun<erl_eval.12.99386804>
4> Add([[1,2],[3,4]],[[4,5],[6,7]]).                               
[[5,7],[9,11]]
1
Hynek -Pichi- Vychodil 15 nov. 2017 a las 06:32