【问题标题】:Can I add type information to arguments that are functions in Julia?我可以将类型信息添加到 Julia 中作为函数的参数吗?
【发布时间】:2014-01-10 20:07:14
【问题描述】:

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

考虑以下示例:

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}

【问题讨论】:

    标签: julia


    【解决方案1】:

    目前没有。不过,我们将来可能会在这些方面添加一些内容。

    【讨论】:

    • 还有类似 Haskell 的一体化类型声明的机会吗? (就像问题的底线)
    • 有一些机会。
    • 0.5 有变化吗?我们现在可以为命名函数做function hello(x::String)::String "Hello, "*x*"!" end...我们可以按照x::Function{ _ -> String}; x = hello 做任何事情吗? (顺便提一下,在上面的例子中,hello::Function 通过,typeof(hello)#helloBase.return_types(hello)1-element Array{Any,1}: String。)
    • 并非如此。您可以向方法添加返回类型,但函数本身的类型仍然不包括 arity 或参数类型或返回类型。
    【解决方案2】:

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

    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-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多