julia笔记
14 Jan 2019
|
|
由于julia和python/ruby/perl非常像,没什么可以整理的,所以这里只做记录备忘
环境搭建
安装julia 进入repl 按]进入安装包模式
add IJulia
多重派发
引自这篇文章
动态实现c++函数重载的效果
from functools import singledispatch
@singledispatch
def fun(arg, verbose=Falase):
print(arg)
@fun.register(int)
def _(arg, verbose=False):
print(arg)
abstract type TypeA end
struct TypeB <: TypeA end
struct TypeC <: TypeA end
wooo(a1::TypeA, a2::TypeA) = println("A/A")
wooo(a::TypeA, b::TypeB) = println("A/B")
callme(a1::TypeA, a2::TypeA) = wooo(a1, a2)
b = TypeB(); c = TypeC();
callme(c, b)
类型系统
Julia的类型主要分为抽象类型(Abstract Type)和实体类型(Concrete Type),实体类型主要分为可变类型(Mutable Type)和不可变类型(Immutable Type)
abstract type AbstractType end
struct ImmutableType <: AbstractType
end
mutable struct MutableType <: AbstractType
end
抽象类型使用 abstract type 关键字 匹配 end声明。默认的合成类型都是不可变类型,使用 struct 搭配 end 声明。而可变类型在 struct 前面增加 mutable 关键字即可。某个实体类型(concrete type)是另外一个抽象类型(abstract type)或者抽象类型是另外一个抽象类型的子类,这样的关系使用 <: 来声明。
一个抽象类型的所有子类型会构成一颗树,其中实体类型一定在树的叶子结点
下面这个 view_tree
函数会对一颗类型树进行深度优先遍历(DFS)
using InteractiveUtils # 0.7 之后需要调用这个标准库
function view_tree(T, depth=0)
println(" "^depth, T)
for each in subtypes(T)
view_tree(each, depth+1)
end
end
view_tree(AbstractType)
运行会得到AbstractType作为父节点的类型树
AbstractType
ImmutableType
MutableType
这个设计观点很新颖
c++是吧这些东西放到编译期来做
参考
- https://rogerluo.me/Brochure.jl/dev/ 文档不错