elixir中的递归和匿名函数

Bat*_*u99 34 recursion anonymous-function elixir

我正在尝试定义一个匿名函数来做一个点积,我可以将它编码为私有函数而没有任何问题,但我正在努力使用匿名函数语法.我知道我可以以不同的方式实现它,但我试图了解如何使用模式匹配和递归来定义匿名函数.这是我目前的实施

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

我在编译时遇到这个错误:

function dot/0 undefined
Run Code Online (Sandbox Code Playgroud)

任何提示?这不可能吗?

Jos*_*lim 38

无法在Elixir中重现匿名函数.

Erlang 17(目前是发布候选版本)为Erlang增加了这种可能性,我们计划尽快利用它.现在,最好的方法是定义一个模块函数并传递它:

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
Run Code Online (Sandbox Code Playgroud)

然后:

&neural_bias/3
Run Code Online (Sandbox Code Playgroud)

  • elixir现在支持递归匿名函数吗? (4认同)
  • @JoséValim我们可以在哪里讨论关于这个主题的辩论? (4认同)
  • 如[here](http://stackoverflow.com/a/25829932/1276737)所述,可以使用优秀的固定点组合器(Y组合器)仅使用匿名函数来定义递归函数.虽然我觉得提问者期待一流的语言支持,而不必使用`Y`. (2认同)
  • @JoséValim这是否已添加? (2认同)

ham*_*top 29

不太正式但仍然可以接受的方法是:

factorial = fn
  (0,_) -> 1
  (1,_) -> 1
  (n, fun) -> n * fun.(n - 1, fun)
end
Run Code Online (Sandbox Code Playgroud)

你打电话给它 factorial.(6, factorial) # 720


CMC*_*kai 9

这是一个固定的(Y)组合子:

fix = fn f -> 
    (fn z ->
        z.(z)
    end).(fn x -> 
        f.(fn y -> (x.(x)).(y) end)
    end)
end
Run Code Online (Sandbox Code Playgroud)

以下是您使用它的方式:

factorial = fn factorial ->
    fn
        0 -> 0
        1 -> 1
        number -> number * factorial.(number - 1)
    end
end

fix.(factorial).(6) # 720
Run Code Online (Sandbox Code Playgroud)

仅适用于使用1参数递归的函数.Elixir没有可变参数.要支持多个参数,您需要添加比单个参数更多的参数y:f.(fn a,b -> (x.(x)).(a,b) end).