在Julia中将类型参数作为函数参数引用

6
我想在Julia中创建一个“整数模p”类型。(我确定已经有一个用于此的包,这只是个人练习。)
type Intp{p}
    v::Int8
end

function add(a::Intp{p},b::Intp{p})
    return Intp{p}((a.v + b.v) % p)
    end

我在定义 add 函数时遇到了一个错误,提示 p 未定义。我该如何在 add 函数内引用 p?
(注:我可以尝试像这样


type Intp
    v::Int8
    p
end

function add(a::Intp,b::Intp)
    return Intp((a.v + b.v) % a.p,p)
    end

但是这将需要每个数都存储p,我觉得这会很低效,而且我想到了一般化的情况下会非常低效。我更希望只为类型指定p一次,并在接受该类型参数的函数中引用它。
1个回答

9
你的第一个例子非常接近,但需要在方法名称和签名之间包含{p},如下所示:
function add{p}(a::Intp{p},b::Intp{p})
    return Intp{p}((a.v + b.v) % p)
end

否则,你正在编写一个针对一对Intp{p}值的方法,其中p是当前特定值的任何值 - 在您的情况下,这恰好是没有任何值,因此会出现错误消息。因此,Julia方法的一般签名为:
  1. 方法名称
  2. { }中的类型参数(可选)
  3. ( )中的参数

1
谢谢Stefan。我喜欢你的语言。 - Alexander Gruber
2
最近版本的Julia不再接受这种语法。相反,在函数参数列表的右括号之后,使用where子句可以在函数体中访问类型参数:function add(a::Intp{p},b::Intp{p}) where {p}答案https://dev59.com/v1gQ5IYBdhLWcg3w-o1w#41940710提供了有关此语法更改的其他信息。 - Fred Schleifer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接