我可以编写像 C++ 模板函数一样“尽可能”工作的 Julia 方法吗?

2023-12-20

rand适用于范围:

rand(1:10)

我想做rand与...一起工作Array,以及任何可索引且具有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 does.


方法扩展

正如一些人指出的那样,朱莉娅让你extend函数:您可以使用针对不同类型以不同方式工作的函数(请参阅这部分文档 http://docs.julialang.org/en/release-0.3/manual/methods/).

例如:

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

在此示例中,我们有一个版本(或method)当(且仅当)参数属于以下类型时调用的函数Int。第一个被称为其他。

我们说我们已经延长了f函数,现在有2个方法。

你的问题

那么,您想要的是延长rand功能。

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

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

问题: rand无法在程序的第一个版本上进行扩展。根据这篇文档 http://docs.julialang.org/en/release-0.3/manual/modules/#summary-of-module-usage, 写作import Base.Random不让rand可用于方法扩展。

在尝试延长的同时rand,你其实覆盖 the rand功能。之后,当您调用该函数时rand,只有你的方法!

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以编写像 C++ 模板函数一样“尽可能”工作的 Julia 方法吗? 的相关文章

  • 为什么json序列化器不符合多态性?

    我在 NET 4 5 Windows 应用商店应用程序中使用库存 JSON 序列化器 System Runtime Serialization Json DataContractJsonSerializer 我有一个由 API 提供商提供的
  • C++ 多态加载/保存

    我正在保存并重新加载一堆从公共基础派生的不同对象到一个文件 显然我需要存储类名 或类似的名称 以便在重新加载时创建正确的对象类型 保存很简单 class Base virtual string className const 0 void
  • 如何制作任意级别的嵌套for循环

    我可以像这样做一个两级嵌套循环 for i1 in 1 n for i2 in 1 n do something with i1 i2 如何将其扩展到任意级别的嵌套循环 例如 我可以在 Python 中执行此操作以循环 n m 的笛卡尔积
  • 泛型与接口的实际优势

    在这种情况下 使用泛型与接口的实际优势是什么 void MyMethod IFoo f void MyMethod
  • 在基类集合上调用派生方法

    我有一个名为 A 的抽象类 以及实现 A 的其他类 B C D E 我的派生类持有不同类型的值 我还有一个 A 对象的列表 abstract class A class B class A public int val get privat
  • 约束包如何工作?

    背后的想法数据 约束 Forall http hackage haskell org packages archive constraints 0 3 2 doc html src Data Constraint Forall html据我
  • RankN多态性和令人发指的克莱斯利之箭

    我不明白为什么 demobind1 的定义会产生一些编译器错误 它看起来像一个愚蠢的翻转 但不知何故 LANGUAGE GADTs LANGUAGE RankNTypes ScopedTypeVariables TypeOperators
  • 是否可以从 Julia 调用 Python 函数并返回其结果?

    我正在使用 Python 从网络上抓取数据 我想使用这些数据在 Julia 中运行计算 是否可以在 Julia 中调用该函数并返回其结果 或者我最好直接导出到 CSV 并以这种方式加载数据 绝对地 看PyCall jl https gith
  • 终止 Julia 数组理解中的 For 循环

    我在 Julia 中有以下代码行 X i i 2 for i in 1 100 if i 2 5 0 基本上 它返回一个元组列表 i i 2 from i 1 to 100如果剩余的i 2 and 5为零 我想做的是 在数组理解中 跳出 f
  • 如何将缺失值插入到 Julia 的数据框中

    df3 10 A missing df3 15 B missing df3 15 C missing 即使 NA 也不起作用 我收到错误 方法错误 不能convertMissings Missing 类型的对象到 Int64 类型的对象 这
  • 在 C++ 中定义虚拟 get 和 set 函数是否被认为是一个好习惯?

    如果我有一个简单的 2 级类层次结构 例如 level 1 class Spare Part private string name double price public Spare Part string getName return
  • Julia 中使用微分方程的二阶 ODE

    我正在尝试使用 Julia 中的微分方程求解谐振子 IE using DifferentialEquations using Plots m 1 0 1 0 function mass system ddu du u p t a t 1 m
  • 如何在 Julia 中有效计算二次形式?

    我想计算一个二次形式 x Q y在朱莉娅 对于这种情况 计算此值的最有效方法是什么 没有假设 Q是对称的 x and y是相同的 x y Both Q是对称的并且x y 我知道朱莉娅有dot 但我想知道它是否比 BLAS 调用更快 现有的答
  • 可选参数的 Julia 约定

    假设我有一个函数 例如f x y 但是y参数是可选的 首选设置方式是什么y作为可选参数 对我有用的一种选择 function f x y nothing do stuff if y nothing do stuff else do stuf
  • 如何创建一个类,在不预先指定可能函数列表的情况下,对对象进行类型擦除,直到对它们调用函数为止?

    背景 标题可能听起来很混乱 所以让我解释一下 首先 这里有一个我的实现的最小版本 http coliru stacked crooked com a 23efb9aa3f59bb9e 这样您就可以更轻松地理解这些概念 如果您看过 Sean
  • 读入 Julia 中的数组

    我对 Julia 比较陌生 正在寻找一种有效的方法来从文本文件中读取并将每个 列 存储在数组中 我有 2 列 但通用解决方案也很棒 例如 我想要输入 1 2 3 4 5 6 被读入两个数组 例如 x 和 y 使得 x 1 3 5 和 y 2
  • 使用 hibernate 的多态“get”,多对一,InheritanceType.JOINED

    我有这样的东西 具有多个座位中的一个座位的汽车类别 Seat 有一个子类 LeatherSeat public class Car private Seat seat ManyToOne fetch FetchType LAZY publi
  • C++函数重载问题

    我有函数重载的问题 我将向您展示一些简单的例子 class A class B public A void somefunction A A void somefunction B B void someotherfunction A a1
  • 为什么我不能对普通变量进行多态?

    我是一名Java程序员 最近开始学习C 我对某事感到困惑 据我了解 在 C 中 要实现多态行为 您必须使用指针或引用 例如 考虑一个类Shape与实施的方法getArea 它有几个子类 每个子类都以不同的方式重写 getArea 然后考虑以
  • 是否有任何不使用公共虚拟方法的正当理由? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 是否有任何不使用公共虚拟方法的正当理由 我在某处读到我们应该避免使用公共虚拟方法 但我想向专家确认这是否是有效的声明 对于良好且稳定的 API

随机推荐