我看到很多地方都提到 Julia 是“可组合的”。我知道这个词本身的意思是:
可组合性是处理组件之间相互关系的系统设计原则。高度可组合的系统提供的组件可以通过各种组合进行选择和组装,以满足特定用户的需求。
但我很好奇 Julia 的具体组件是什么使其可组合。是否能够使用我自己的实现覆盖基本函数?
我想我会冒险回答,尽管我的理解可能不比你的更完整!
据我所知(很大程度上来自 Stefan 的“多次调度的不合理有效性”JuliaCon 谈话,由奥斯卡在评论中链接),我会说它部分是:
正如您所说,该能力使用您自己的实现覆盖基本函数[并且,关键是,由于多次分派,因此在适当的时候让它“正常工作”(被分派到)
……因为这意味着如果您制作自定义类型和定义该类型的所有基本/原始操作(如在https://docs.julialang.org/en/v1/manual/interfaces/ 中- 说+-*/ 等。对于数字类型,或getindex,setindex! 等。对于数组-像类型等),那么任何基于这些基础的更复杂的程序也将“适用于”您的新自定义类型。
而这又意味着您的自定义类型也将工作(AKA撰写)与其他人的包不需要(例如)显式兼容性垫片,只要人们没有过度约束他们的函数参数类型(顺便说一句,这就是为什么过度约束函数参数类型是Julia 反模式)
继 1) 之后,许多Base方法也只是普通的 Julia,因此只要定义了正确的基本操作,它也可以与您的新自定义类型一起使用
事实上,Julia 的基本类型和方法通常足够高效且方便,在许多情况下不需要做任何自定义,所以你可以将所有操作的块放在一起,例如,普通的 Julia 数组或元组等。
最后与 Python 之类的语言相比,这一点可能是最值得注意的,例如,生态系统的每个足够大的子集(numpy、tensorflow 等)都有自己的(例如)数组的重新实现,为了更好的性能,它们最终都被实现完全使用其他语言(C++,对于 numpy 和 TF),因此可能不会相互组合。