Function Julia中的复制函数

Function Julia中的复制函数,function,julia,updating,cloning,Function,Julia,Updating,Cloning,我需要根据函数以前的定义覆盖它,这会导致stackoverflow错误。 我试过使用deepcopy(f),但它只返回对f的引用,所以这不起作用。 我需要反复做的是: Old(x) = pdf(Uniform(),x) New(x) = updating_function(Old, Y1) Old(x) = deepcopy(New(x)) New(x) = updating_function(Old, Y2) [...] 编辑: 我的总体目标是拥有一个函数,该函数采用先验分布,并根据我的应用

我需要根据函数以前的定义覆盖它,这会导致stackoverflow错误。 我试过使用deepcopy(f),但它只返回对f的引用,所以这不起作用。 我需要反复做的是:

Old(x) = pdf(Uniform(),x)
New(x) = updating_function(Old, Y1)
Old(x) = deepcopy(New(x))
New(x) = updating_function(Old, Y2)
[...]
编辑: 我的总体目标是拥有一个函数,该函数采用先验分布,并根据我的应用程序输出具有异常信号结构的后验函数。 这方面的一个简单运行示例是

Old_pdf(x)= pdf(Uniform(),x)
Old_mean=0.5

function BU(d,low)
value, tol = quadgk(Old_pdf, Old_λ, 1)
truncated(λ)=d(λ)/value
end

Newpdf=BU(Old_pdf,Old_mean)
Old_mean, tol= quadgk(x -> Newpdf(x)*x, Old_mean, 1)
Old_pdf=BU(Old_pdf,Old_mean)
我知道这个例子可以用分发包中的函数来解决。我的申请不是这样的

我已经找到并阅读了IRTools软件包的文档,但我无法完成这项工作。尤其是当我尝试时

Old(x) = pdf(Uniform(),x)
New(x) = updating_function(Old, Y1)
const Old_ir= IRTools.Inner.code_ir(New, Tuple{Int})
Old(x) = IRTools.func(Old_ir)


我获得了一个行为与函数不同的对象,因此在代码的其余部分生成了错误的方法。我对此做了几次尝试,完全有可能遗漏了一些琐碎的东西。

我认为您只需要匿名函数:

Y1 = 5.0
Y2 = 7.0
updating_function(f1,c) = x -> 2.0 * f1(x) + c
Old = x->sqrt(x)
New = updating_function(Old, Y1)
Old = New
New = updating_function(Old, Y2)
function BU(f, λ, y)
    # I guess here you would use the observations `y` in some way?
    z, _ = quadgk(f, λ, 1)
    return λ -> f(λ) / z
end

mean(f, λ) = quadgk(x -> f(x) * x, λ, 1)[1]

original_pdf(x) = pdf(Uniform(), x)

f = original_pdf
λ = 0.5
for y in Y
   f = BU(f, λ, y)
   λ = mean(f, λ)
end
现在我非常努力,我想我明白你在做什么,但是你举的例子不是很清楚。考虑这个概念。


顺便说一句,这样做很好。

匿名函数不符合您的用例有什么具体原因吗?类似于
更新函数(x->pdf(Uniform(),x),Y1)
?如果没有密码,很难准确地知道您需要什么。使用
code\u ir
,您必须传递所需方法类型的元组。PDF格式可能是
Float64
,而不是
Int
。在极少数奇怪的情况下,使用IRTools复制函数是唯一正确的方法。对,谢谢。我编辑以提供MCRE。我的BU函数相当长,也比较混乱,所以为了清楚起见,我没有使用匿名函数。我确实尝试过用Float64@phipsgabler替换Int,但仍然得到了相同的错误。我的目标是让函数接受先验分布并进行贝叶斯更新,但信号结构有点不寻常。这是我的原始语法,也是我如何通过更新函数得到stackoverflow错误的。事实上,你的代码运行,而我上面发布的部分没有运行,这增加了我的困惑。首先,非常感谢你花时间回答,我为不清楚而道歉。我遵循了你建议的结构,现在我不再得到溢出错误了。我不太清楚是什么破坏了导致错误的自引用,但是update()函数中的一个函数似乎完成了这个任务。我也会调查褶皱,谢谢你的建议
f(x)=bla
f=x->bla
在某种程度上是完全不同的。闭包从词汇上捕获其环境,而函数重新定义将改变对它的所有引用的含义。