gpt4 book ai didi

julia - 如何编写一个类型推断友好的内存器

转载 作者:行者123 更新时间:2023-12-04 08:30:18 24 4
gpt4 key购买 nike

function memoize(f, T)
cache = Dict{Any, T}()
function g(args...)::T
key = make_key(args...)
get!(cache, key) do
f(args...)
end
end
g
end

fib = memoize(x::Int -> begin
if x == 2
return 2
end
if x == 1
return 1
end
fib(x - 1) + fib(x - 2)
end, Int)

这就是我得到的,遗憾的是,尽管我进行了注释,但它无法识别返回类型。

另外,有没有办法注释匿名函数的返回类型?
@code_warntype fib(3)

Variables:
#self#::#g#40{##44#45,DataType,Dict{Any,Int64}}
args::Tuple{Int64}
key::Tuple{Int64}
#39::##39#41{Tuple{Int64},##44#45}

Body:
begin
SSAValue(0) = (Core.getfield)(#self#::#g#40{##44#45,DataType,Dict{Any,Int64}},:T)::DataType
key::Tuple{Int64} = (Core.tuple)((Core.getfield)(args::Tuple{Int64},1)::Int64)::Tuple{Int64} # line 20:
#39::##39#41{Tuple{Int64},##44#45} = $(Expr(:new, ##39#41{Tuple{Int64},##44#45}, :(args), :((Core.getfield)(#self#,:f)::##44#45)))
SSAValue(1) = #39::##39#41{Tuple{Int64},##44#45}
SSAValue(2) = (Core.getfield)(#self#::#g#40{##44#45,DataType,Dict{Any,Int64}},:cache)::Dict{Any,Int64}
return (Core.typeassert)((Base.convert)(SSAValue(0),$(Expr(:invoke, LambdaInfo for get!(::##39#41{Tuple{Int64},##44#45}, ::Dict{Any,Int64}, ::Tuple{Int64}), :(Main.get!), SSAValue(1), SSAValue(2), :(key))))::ANY,SSAValue(0))::ANY
end::ANY

更新

我制作了一个包,通过宏为类型推断友好的通用函数内存提供基本支持。它还允许从函数参数自定义缓存键。

https://github.com/colinfang/Memoize.jl

最佳答案

为了让 Julia 专门针对特定的实现 DataType ,您必须使用 ::Type{T}参数类型:

function memoize{T}(f, ::Type{T})


这个简单的改变意味着 Julia 将为每一种类型专门化方法 memoize遭遇,而不是仅仅为所有人制定一种特化 DataType s。

关于julia - 如何编写一个类型推断友好的内存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43238916/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com