功能按照changelog for Julia 0.5,調度在朱莉婭V0.5 +
每個功能和關閉,現在有自己的類型。
這是否意味着現在可以向更高階的函數提供更詳細的信息,例如, foo(bar :: Function{Float64}) = ...
,與之前的0.5相反,bar
的類型不能比Function
更具體嗎?
如果是這樣,什麼是這樣做的正確方法是什麼?如果不是,那麼除了編譯器能夠更好地優化生成的代碼之外,這個更改的實際導入是什麼? TIA。
功能按照changelog for Julia 0.5,調度在朱莉婭V0.5 +
每個功能和關閉,現在有自己的類型。
這是否意味着現在可以向更高階的函數提供更詳細的信息,例如, foo(bar :: Function{Float64}) = ...
,與之前的0.5相反,bar
的類型不能比Function
更具體嗎?
如果是這樣,什麼是這樣做的正確方法是什麼?如果不是,那麼除了編譯器能夠更好地優化生成的代碼之外,這個更改的實際導入是什麼? TIA。
不是真的沒有。 我明白你在做什麼,我喜歡它,但這是不可能的。 (當然不是現在,可能永遠沒有可能。一天使用的特徵。)
讓我們看一個例子:foo
和bar
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
。 兩種功能都可以使用。
這限制了應用,作爲白名單。
謝謝。在對'typeof'進行實驗之後,我懷疑這一點。 –
原來以[類型安全函數包裝器](https://github.com/yuyichao/FunctionWrappers.jl)的形式存在這個問題的部分解決方案。 –