20

我可以将类型信息添加到作为函数的参数吗?

考虑以下示例:

function f{T} (func, x::Int)
    output = Dict{Int, Any}()
    output[x] = func(x)
    return output
end 

对于字典的值类型,我不喜欢这样说Any。我宁愿做以下事情:

function f{T} (func::Function{Int->T}, x::Int)
    output = Dict{Int, T}()
    output[x] = func(x)
    return output
end 

我可以提供这样的功能类型提示吗?我有点想说以下

f :: (Int -> T), Int -> Dict{Int, T}
4

2 回答 2

13

不是现在。但是,我们将来可能会在这些方面添加一些内容。

于 2014-01-10T21:05:25.157 回答
1

这不是主要问题的答案,而是问题中一个非常丑陋Any的解决方法Dict

function f(func, x::Int)
    T = code_typed(func, (Int,))[1].args[3].typ
    output = Dict{Int, T}()
    output[x] = func(x)
    return output
end

这可能效率不高,可能只适用于简单的情况(甚至不包括匿名函数),比如

>>> g(x) = x*2
>>> typeof(f(g, 1234))
Dict{Int64,Int64}

>>> h(x) = x > zero(x) ? x : nothing
>>> typeof(f(h, 1234))
Dict{Int64,Union(Int64,Nothing)}

编辑:

这效果更好:

function f(func, x::Int)
    [x => func(x)]
end

>>> dump( f(x->2x, 3) )
Dict{Int64,Int64} len 1
    3: Int64 6
于 2014-02-01T03:18:23.003 回答