2014-01-10 1 views
17

함수 인 인수에 형식 정보를 추가 할 수 있습니까? 나는 사전의 값 유형 Any을 말해야하는 것을 좋아하지 않는다Julia의 함수 인 인수에 형식 정보를 추가 할 수 있습니까?

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

:

는 다음과 같은 예를 생각해 보자. 나는 차라리 다음을 할 것입니다 :

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} 

답변

11

현재로. 그러나 앞으로이 라인을 따라 뭔가 추가 할 수 있습니다.

+1

올인원도 유형 선언 하스켈 같은의 가능성은? (질문의 요점처럼) – MRocklin

+2

기회가 있습니다. – StefanKarpinski

+0

0.5로 변경 했습니까? 이제 우리는'function hello (x :: String) :: String "Hello"* x * "!"를 할 수 있습니다. end'라는 이름의 함수들에 대해서 ...'x :: Function {_ -> String}; x =여보세요? (위의 예제에서'hello :: Function'은'hello'가'hello'이고'Base.return_types (hello)'가''1 요소 배열'{Any, 1} : String입니다. '.) – Philip

1

이 주요 질문에 대한 답변,하지만 더 정말 추한 해결 방법 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 
관련 문제