gpt4 book ai didi

function - 在 Julia v0.5+ 中调度函数

转载 作者:行者123 更新时间:2023-12-05 00:54:40 26 4
gpt4 key购买 nike

根据changelog for Julia 0.5 ,

Each function and closure now has its own type.



这是否意味着现在可以向高阶函数提供更详细的信息,例如 foo(bar :: Function{Float64}) = ... ,而不是 0.5 之前的版本,其中 bar 的类型不能比 Function 更具体?

如果是这样,这样做的正确方法是什么?如果不是,除了编译器能够更好地优化生成的代码之外,这种变化的实际意义是什么? TIA。

最佳答案

不是真的没有。
我明白你的意思,我喜欢它,但这是不可能的。
(当然现在不会,可能永远不会。也许有一天会使用特征。)

让我们看一个例子: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 编译器(松散地使用该术语)可以。

为什么它的超父类(super class)型不更具体,而不仅仅是功能?
那会是什么? Function{Int64}Function{String} ?
julia 中的函数没有类型签名,方法有。
函数只是多次分派(dispatch)的名称,方法实际上是分派(dispatch)的对象。粗略地说,函数名称表示我应该查看哪个表,而参数的类型(即它的类型签名)是在该表中查找的关键。方法本身就是使用该键返回的内容。

所以让我们继续我们的例子,看看我们能做什么:
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作为它的论据。当你给它一个 #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 .
任何一个功能都有效。

作为白名单,这具有有限的应用程序。

关于function - 在 Julia v0.5+ 中调度函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39671493/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com