Math Julia中具有函数字段的不可变类型

Math Julia中具有函数字段的不可变类型,math,types,julia,Math,Types,Julia,据我所知,函数被设计为对类型进行操作,而不是设计为属于类型,但很明显,我可以做以下几点: immutable Sphere dimension::Int metric::Function end sphere = Sphere(2, (x1, x2)->dot(x1, x2)) 然后我可以从类型内部调用此函数: sphere.metric([1,2],[2,3]) 这是朱莉娅的坏习惯吗?将它定义为不可变的使得我无法更改它的维度,但假设我对此没有问题,它也使得我无法更改

据我所知,函数被设计为对类型进行操作,而不是设计为属于类型,但很明显,我可以做以下几点:

immutable Sphere
    dimension::Int
    metric::Function
end

sphere = Sphere(2, (x1, x2)->dot(x1, x2))
然后我可以从类型内部调用此函数:

sphere.metric([1,2],[2,3])
这是朱莉娅的坏习惯吗?将它定义为不可变的使得我无法更改它的维度,但假设我对此没有问题,它也使得我无法更改度量,这模仿了在传统OOP中无法更改对象内部的那些方法

这是在我努力寻找在Julia中开发Riemanian流形的正确方法时出现的。例如,假设我有以下代码:

abstract Manifold

immutable Sphere <: Manifold
    dimension::Int
end

immutable Torus <: Manifold
    dimension::Int
end

metrc(M::Sphere, x1, x2) = ...
metric(M::Torus, x1, x2) = ...
抽象流形

immutable Sphere在Julia中,在复合类型中使用函数类型的字段来模拟成员函数(在许多OO语言中使用)是一种不好的做法

但据我所知,度量实际上是被看作
球体
类型中的另一个字段,而不是成员函数。所以我不会说这是个坏习惯


还有效率的问题。现在,将度量函数存储在字段中意味着编译器在运行时之前几乎不知道调用哪个函数,每次调用都会产生大量开销。最终(在Julia 0.5?)可以对要存储的函数上的
球体
类型进行参数化,这可以恢复与其他解决方案相比的效率

这是一个非常古老的线程,但是我们在中设计流形时遇到了类似的问题(实际上完全相同),我们选择了一种我称之为“lazy at first”的方法


因此,正如您对类型
球体所做的那样,这在精神上与这个问题有些相似:。在那里你可能会得到一些灵感。@MattB。就我所知,你是说我应该定义一个抽象度量类型,然后每个度量都有一个抽象度量类型的抽象子类型,然后把我的流形变成一个参数类型
Sphere{T@Thoth虽然这两种方法并不等同,而且存在权衡问题,但正如您所说,这两种方法中有哪一种真的比另一种更全面?在一种情况下,您附加了一个函数(公认为数据),在另一种情况下,您附加了一个类型(公认为参数)@LucDanton我觉得这是做作的,因为你必须定义整个其他类型的系统,以便你的函数能够区分具有不同度量的球体。你认为这两种方法之间的主要权衡是什么?对我来说,主要区别在于,如果你有两个类型的值,例如
Sphere
,它们可能具有不同的租用度量,您必须进一步细化才能弄清楚这一点。这可能是可取的,也可能不是,取决于您想做什么,并且只有在同时涉及两个或多个
Sphere
等值时才真正重要。感谢您的回答,您能否详细说明在特定函数上参数化类型的含义?如据我所知,您可以参数化一个类型,但只能针对另一个类型,而不是该类型的特定实例。这是真的,但目前正在进行一项彻底的改革,将函数和类型统一起来,以便每个特定的函数都由一个不同的类型表示。此外,还将在对然而,在julia dev论坛的某个地方可能有很多关于这方面的背景(我忘了在哪里)。