gpt4 book ai didi

polymorphism - 我可以编写像 C++ 模板函数一样工作 "whenever possible"的 I Julia 方法吗?

转载 作者:行者123 更新时间:2023-12-04 11:37:06 25 4
gpt4 key购买 nike

rand适用于范围:

rand(1:10)

我想做 randArray 合作, 以及任何可索引且具有 length :
import Base.Random
rand(thing) = thing[rand(1:length(thing))]

array = {1, 2, 3}
myRand(array)

range = 1:8
myRand(range)

tupple = (1, 2, 3, "a", "b", "c")
myRand(tupple)

...但是如果我尝试这个,我的实现堆栈会溢出,大概是因为它是完全通用的并且匹配所有传递的东西,所以它最终会调用自己?

有没有办法解决这个问题?我想更好地理解 Julia 的多态函数,而不是为这个特定的(可能是愚蠢的)函数特化修复。

是否还有一个工具可以发现可用的各种实现,以及使用特定参数调用的调试?

好吧,一些挖掘。这很有趣…

我将启动一个新的 REPL,并且:
julia> import Base.Random

julia> rand(thing) = thing[rand(1:length(thing))]
rand (generic function with 1 method)

julia> rand({1,2,3})
ERROR: stack overflow
in rand at none:1 (repeats 80000 times)

…哦,天哪,这就是我所说的递归调用和堆栈溢出。

但是,看这个。我杀死 Julia 并再次启动 REPL。这次我 import Base.Random.rand :
julia> import Base.Random.rand

julia> rand(thing) = thing[rand(1:length(thing))]
rand (generic function with 33 methods)

julia> rand({1,2,3})
3

它有效——它将我的新实现添加到所有其他实现中,并选择了正确的实现。

所以,我的第一个问题的答案似乎是——“它只是有效”。这是惊人的。这是如何运作的?!

但是有一个关于模块的听起来不太有趣的问题,以及为什么 import Base.Random不拉入 rand方法或给出错误,但是 import Base.Random.rand做。

最佳答案

方法扩展

正如一些人所指出的,Julia 允许您扩展函数:您可以拥有针对不同类型以不同方式工作的函数(参见 this part of the documentation)。

例如:

f(x) = 2
f(x::Int) = x

在这个例子中,我们有一个函数的版本(或方法),当(且仅当)参数是 Int 类型时调用。 .第一个被称为否则。

我们说我们已经扩展了 f函数,现在它有2个方法。

你的问题

那么,您想要的是扩展 rand功能。

你想要你的 rand函数,如果使用未被其他方法捕获的参数调用,则执行 thing[rand(1:length(thing))] .如果操作正确,您将调用 rand应用于 Range 的方法对象,因为您正在传递 1:length(thing)作为论据。

虽然有缺陷(如果 thing 没有长度,例如复数呢?),我想说你的第一次尝试是非常合理的。

问题 : rand无法在您的程序的第一个版本上扩展。根据 this piece of documentation , 写作 import Base.Random不做 rand可用于方法扩展。

在尝试扩展 rand 时, 你实际上覆盖了 rand功能。之后,当你调用函数 rand ,只有你的方法!

请记住,您依赖的事实是,范围的方法(例如 rand(1:10) )是在 elsewere 中定义的,并且它给出了您预期的结果。发生的事情是这个方法被你的覆盖了,所以你的方法被再次调用(递归)。

解决方案 : 进口 rand比如它可以扩展。您可以在文档的表格中看到这一点。

请注意,您的第二个程序(带有 import Base.Random.rand 的程序)和 Colin 的程序(带有 importall Base.Random 的程序)正是这样做的。这就是他们工作的原因。

请记住哪些方法可用于扩展或不可用于扩展,如果文档不够清晰,欢迎提交错误报告(或修复)。

关于polymorphism - 我可以编写像 C++ 模板函数一样工作 "whenever possible"的 I Julia 方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28188800/

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