2016-09-24 152 views
5

功能按照changelog for Julia 0.5調度在朱莉婭V0.5 +

每個功能和關閉,現在有自己的類型。

這是否意味着現在可以向更高階的函數提供更詳細的信息,例如, foo(bar :: Function{Float64}) = ...,與之前的0.5相反,bar的類型不能比Function更具體嗎?

如果是這樣,什麼是這樣做的正確方法是什麼?如果不是,那麼除了編譯器能夠更好地優化生成的代碼之外,這個更改的實際導入是什麼? TIA。

+0

原來以[類型安全函數包裝器](https://github.com/yuyichao/FunctionWrappers.jl)的形式存在這個問題的部分解決方案。 –

回答

6

不是真的沒有。 我明白你在做什麼,我喜歡它,但這是不可能的。 (當然不是現在,可能永遠沒有可能。一天使用的特徵。)

讓我們看一個例子:foobar

julia> foo(x::String) = println(x) 
foo (generic function with 1 method) 

julia> foo(x::Int64) = println(x+1) 
foo (generic function with 2 methods) 

julia> bar(x...) = println(x) 
bar (generic function with 1 method) 

什麼是foo類型層次結構?

julia> typeof(foo) 
#foo 

julia> supertype(typeof(foo)) 
Function 

julia> supertype(supertype(typeof(foo))) 
Any 

所以我們看到他們鍵入foo功能是#foo這是Function一個亞型。請注意,#表示這是一個生成的名稱,在編寫代碼時不能將哈希名稱放在名稱中,但可以使用julia編譯器(使用術語鬆散地)。

爲什麼不其超級超更具體的,不僅僅是發揮作用? 它會是什麼? Function{Int64}Function{String}功能在茱莉亞,沒有類型簽名,方法做。 一個函數只是一個多派遣的名字,一個方法實際上是派遣給的。粗略地說,函數名稱表示我應該查看哪個表,並且參數的類型(即它是類型簽名)是在該表中查找的關鍵。該方法本身就是使用該鍵返回的內容。

所以讓我們繼續我們的例子,看看我們能做些什麼:

julia> dothing(f::typeof(foo)) = f(rand([randstring(), rand(Int64)])) 
dothing (generic function with 1 method) 

julia> dothing(foo) 
3139374763834167054 

julia> dothing(foo) 
Ed2kNGrd 


julia> dothing(bar) 
ERROR: MethodError: no method matching dothing(::#bar) 
Closest candidates are: 
    dothing(::#foo) at REPL[11]:1 

因此,我們已經成功限制dothing,只能採取#foo作爲arguement。看到它時拋出一個錯誤,當你給它一個#bar。 這不是很有用,因爲foo函數是#foo類型的唯一函數。

我們可以使用一個Union但:

julia> dootherthing(f::Union{typeof(foo),typeof(bar)}) = f(rand([randstring(), rand(Int64)])) 
dootherthing (generic function with 1 method) 

julia> dootherthing(foo) 
9107791406050657562 

julia> dootherthing(foo) 
SmB2Xmw8 

julia> dootherthing(bar) 
("1IpZIMnx",) 

julia> dootherthing(bar) 
(-6356894350805213697,) 


julia> dootherthing(str) 
ERROR: UndefVarError: str not defined 

julia> dootherthing(string) 
ERROR: MethodError: no method matching dootherthing(::Base.#string) 
Closest candidates are: 
    dootherthing(::Union{#bar,#foo}) at REPL[19]:1 

dootherthing接受#foo#bar。 兩種功能都可以使用。

這限制了應用,作爲白名單。

+0

謝謝。在對'typeof'進行實驗之後,我懷疑這一點。 –