Лучший способ создать словарь функций - PullRequest
0 голосов
/ 28 августа 2018
#attempt 1: works
f(x::Int64) = x +1
my_functions = Dict("f" => f)

#attempt 2: does not work, something is wrong
new_functions = Dict("g" => g(x::Int64) = x + 5)

Я новичок и новичок в Джулии. Есть ли способ сделать это, как моя вторая попытка выше? Спасибо

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Для полноты: есть также возможность использовать обычный многострочный синтаксис функции в качестве выражения, которое создаст объект функции с именем (например, «выражение с именованной функцией» в JavaScript; это удобно, если вам нужна рекурсия) ):

julia> Dict("g" => function g(x::Int); x + 5; end)
Dict{String,typeof(g)} with 1 entry:
  "g" => g

Первый ; в строке необходим здесь. Замечания @ Bogumił о наборе Dict также применимы, как вы можете видеть.

Использование краткого синтаксиса также возможно, но вы должны поместить выражение в скобки:

Dict("g" => (g(x::Int) = x + 5))
0 голосов
/ 28 августа 2018

Вы можете использовать синтаксис анонимной функции, например:

new_functions = Dict("g" => x::Int64 -> x + 5)

Вы можете прочитать подробности их использования в руководстве к Julia: https://docs.julialang.org/en/latest/manual/functions/#man-anonymous-functions-1.

Редактировать: обратите внимание, что если вы первоначально добавите в словарь только одну функцию, ее тип будет слишком ограничительным, например: Dict{String,getfield(Main, Symbol("##3#4"))}, например ::

julia> new_functions = Dict("g" => x::Int64 -> x + 5)
Dict{String,getfield(Main, Symbol("##15#16"))} with 1 entry:
  "g" => ##15#16()

Так что вы, вероятно, должны явно указать тип:

julia> new_functions = Dict{String, Function}("g" => x::Int64 -> x + 5)
Dict{String,Function} with 1 entry:
  "g" => ##23#24()

или изначально добавить в словарь как минимум две записи:

julia> new_functions = Dict("g" => x::Int64 -> x + 5, "h" => x -> x+1)
Dict{String,Function} with 2 entries:
  "g" => ##11#13()
  "h" => ##12#14()
...