julia中花括号的作用及用法是?


#1

我不太清楚julia中花括号的作用和用法,请各位能指点下
比如:
f(x::T, y::T)::T where {T} = x + y
上面是什么意思,x::T是表示x属于T类型或者x是T的一个实例?但{T} = x + y又是什么意思呢?

还有创建数组时:{T}是表示创建的数组元素类型是属于T类型,这个是固定用法吗?
Array{T}(undef, dims…)

希望高手能指点下{}在Julia中的基本用法,谢谢


#2

个人感觉这个问题不太好直接回答,但对于从Python等语言转过来的人而言,确实是一个常见的问题。强答一点点,希望后面有人能补充。

首先,确保你理解了官方文档中的 参数类型 部分的内容(这部分内容还没翻译,不妨试着边翻译边理解下?:rofl:

这里似乎断句出错了。。。

f(x::T,y::T)::T where {T} = x + y
# 等价于
function f(x::T,y::T)::T where {T}
    x+y
end
# 并不存在所谓的
{T} = x + y

是的

help?> ::
search:

  ::

  With the ::-operator type annotations are attached to expressions and variables in programs. See the manual section on Type Declarations.

  Outside of declarations :: is used to assert that expressions and variables in programs have a given type.

  Examples
  ≡≡≡≡≡≡≡≡≡≡

  julia> (1+2)::AbstractFloat
  ERROR: TypeError: typeassert: expected AbstractFloat, got Int64

  julia> (1+2)::Int
  3

这个,怎么说呢? Array{T}(undef, dims...)只是(最常见的)构建Array的一种方法,还有很多其它构造函数:

建议先从文档出发,然后自己动手写一些简单类型实践下,最后再多读读别人的代码学习下惯用法。


#3

非常感谢您的耐心解答!
我再看看文档
julia之路还很漫长


#4

花括号在Julia里用于声明 UnionAll 类型变量。一般配合where关键字使用

对于类型来说,这个相当于类型的静态参数,是可以在编译时期推导出来的,例如

struct Foo{T}
end

或者配合 where 关键字,用于声明多个UinonAll变量(如果只有一个其实不用花括号的)

function f(x::T, y::T) where T
end

function f(x::TA, y::TB) where {TA, TB}
end

实际上这个花括号相当于

where TA where TB

where后面如果不用花括号只能直接跟随一个UnionAll的变量名(可以加上 <: 的限制),但是不能用于声明多个UnionAll。

对于类型的花括号,一般声明了参数类型会自带一种可以输入静态参数的构造函数(constructor),这些函数可以使用花括号来输入静态参数变量。但是这仅仅只适用于类型的构造函数。Array{T}, Array{T, N} 等等都是这一类构造函数。

Ref:https://docs.julialang.org/en/v1/manual/types/#UnionAll-Types-1


#5

谢谢罗博的指导,学习了,再次感谢!