Size: a a a

Язык программирования Julia / Julia programming language

2021 February 27

VG

Viktor G. in Язык программирования Julia / Julia programming language
Кто-нибудь сталкивался с такой проблемой?
struct Foo{T}
   x::T
end

makevec(range) = map(range) do i
   if i > 3
       Foo(Float64(i))
   else
       Foo(i)
   end
end

bar(vec::Vector{Foo}) = length(vec)

vec = makevec(1:5)
typeof(vec) <: Vector{Foo} # true

bar(vec)

vec = makevec(1:3)
typeof(vec) <: Vector{Foo} # false
typeof(vec) <: Vector{Foo{T}} where T # true

bar(vec) # error
источник

VG

Viktor G. in Язык программирования Julia / Julia programming language
Можно конечно доопределить bar(vec::Vector{Foo{T}}) where T, но придется повторять код...
источник

VG

Viktor G. in Язык программирования Julia / Julia programming language
Еще можно сконвертировать явно vec = Vector{Foo}(vec)
источник

KT

Kirill Tsaregorodtse... in Язык программирования Julia / Julia programming language
Готов поставить деньги на то, что тут этот вопрос затронут )
https://youtu.be/Y95fAipREHQ

Я опять забыл, как эта байда называется, но это в типах постоянно непонятное место
источник

VG

Viktor G. in Язык программирования Julia / Julia programming language
Да, я это видел, интересно кто как обходил
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Вот так работает.

struct Foo{T}
   x::T
end

makevec(range) = map(range) do i
   if i > 3
       Foo(Float64(i))
   else
       Foo(i)
   end
end

bar(vec::Vector{T}) where {T <: Foo} = length(vec)

v = makevec(1:5)

bar(v)

v = makevec(1:3)

bar(v)
источник

VG

Viktor G. in Язык программирования Julia / Julia programming language
о, а ведь точно, спасибо
источник

KT

Kirill Tsaregorodtse... in Язык программирования Julia / Julia programming language
источник

KT

Kirill Tsaregorodtse... in Язык программирования Julia / Julia programming language
а как эта штука называется )
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Kirill Tsaregorodtsev
Готов поставить деньги на то, что тут этот вопрос затронут )
https://youtu.be/Y95fAipREHQ

Я опять забыл, как эта байда называется, но это в типах постоянно непонятное место
То ли ко-, то ли контра- вариантность.
источник

KT

Kirill Tsaregorodtse... in Язык программирования Julia / Julia programming language
что T1 <: T2, а Vector{T1} <: Vector{T2} уже неверно
источник

KT

Kirill Tsaregorodtse... in Язык программирования Julia / Julia programming language
а, точно, что-то такое, да
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Недавно на дискурсе было хорошее объяснение, как этим пользоваться.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Карпински, если мне память не изменяет достаточно подробно объяснял.
источник

VG

Viktor G. in Язык программирования Julia / Julia programming language
А тут как быть:
vec = makevec(1:3)

struct Bar1
   vec::Vector{Foo}
end
Bar1(vec)

struct Bar2{T}
   x::T
   vec::Vector{Foo}
end
Bar2(1, vec) # error
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Я бы для начала поменял vec`на `v 😊
источник

KT

Kirill Tsaregorodtse... in Язык программирования Julia / Julia programming language
по идее так же?
Bar2{T, T2 <: Foo}
....
источник

KT

Kirill Tsaregorodtse... in Язык программирования Julia / Julia programming language
я кстати не уверен даже, что Bar1 и Bar2 являются type-stable
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Они почти гарантированно не type stable
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Точнее не так, они почти гарантированно будут иметь поля с абстрактными типами.
источник