Julia 使用closured数据序列化lambda函数时出错

Julia 使用closured数据序列化lambda函数时出错,julia,Julia,我使用的代码如下: p = _belineInterpolateGrid( map( p -> sin(norm(p)), grid ), grid ) f = open("/data/test.function", "w") serialize( f, p ) close(f) p0 = deserialize( open("/data/test.function", "r") ) 贝里内极间积体在哪里 function _belineInterpolateGrid(PP, Grid)

我使用的代码如下:

p = _belineInterpolateGrid( map( p -> sin(norm(p)), grid ), grid )
f = open("/data/test.function", "w")
serialize( f, p )
close(f)
p0 = deserialize( open("/data/test.function", "r") )
贝里内极间积体在哪里

function _belineInterpolateGrid(PP, Grid)
    ...
    P = Array(Function, N-1, M-1);
    ...
    poly = (x,y) -> begin
        i_x, i_y =  i(x, y);
        return P[i_x, i_y](x, y);
    end
return poly
现在,由于v0.4中的一些,a有一个错误:

ERROR: MethodError: `convert` has no method matching
convert(::Type{LambdaStaticData}, ::Array{Any,1})
This may have arisen from a call to the constructor LambdaStaticData(...),
since type constructors fall back to convert methods.
Closest candidates are:
call{T}(::Type{T}, ::Any)
convert{T}(::Type{T}, ::T)
 ...
 in deserialize at serialize.jl:435

为什么会这样?它是bug吗?如何修复它?

您返回的是lambda,这就是原因。无法判断它是否是bug(可以序列化lambda,但不能反序列化它?)

通过将“在x,y处获取插值”定义为一种类型,可以避免这种情况:

import Base: getindex
type MyPoly
    thepoly
end

function getindex(p::MyPoly, x::Int, y::Int)
    p.thepoly[x+5*y]
end
function getindex(p::MyPoly, I...)
    p.thepoly[I...]
end
function call(p::MyPoly, v)
    #collect helps keep eltype(ans) == Int
    powered_v = map( i->v^i, collect(
                     take(countfrom(),size(p.thepoly,1))))
    powered_v.*p.thepoly
end


p=MyPoly(collect(1:10))
println(p[1])
f = open("serializedpoly", "w")
serialize( f, p)
close(f)
p0 = deserialize( open("serializedpoly", "r"))
println(p[1,1])

v=call(p, 4) #evaluate poly on 4

编辑:为
调用添加了扩展名

在我看来,这像是Julia中的一个bug,而且从v0.4.6开始就已经修复了。尝试升级到该版本或更高版本,看看问题是否仍然存在。

是的,我可以序列化lambda,但无法反序列化它。我正在使用类似于您的解决方案的东西,它是有效的,但问题更大。例如,我想将我的多项式对象设置为可调用,并定义函数调用(function,MyPoly)。现在我有了数值积分的函数:积分(p::function,a::Float,b::Float)。现在我可以将此函数应用于MyPoly,但错误会再次出现。当然,可以为MyPoly创建插值定义,但这只是一个部分解决方案。问题是(而且,我想说明的是),您不必将信息和/或参数打包到lambda中。在一个类型中包含所有这些,在函数调用中包含所有行为/执行。julia的方法是:为数据和参数提供一个容器,在函数中定义行为,并扩展已经定义的函数(
convert
call
index
)。我想这可能被认为是一种回归,因为它在0.3中工作,所以请给出一个小的复制示例并进行分析。这就是说,这种方法似乎有点奇怪,而且可能比实际速度慢。您不使用内置并行化结构有什么原因吗?