Рассмотрим следующий код Python (в качестве примера):
a = 5
b = "a"
l = [a, b] # -> typing.List[typing.Any]
print(l)
# [5, "a"]
Тип списка l
: list
; он не ограничен типами, которые он содержит, потому что Python имеет довольно динамическую типизацию.
Сравните это, скажем, с Go, который строго типизирован по своей структуре:
var list []uint8{1, 2, 3, 4, 5, 6}
Этот список может содержать только целые числа без знака до 255. Он не может содержать никаких других типов.
Также идите:
var multi interface{"string", []int{9, 5}, rune('5'), []interface{}}
Интерфейсы позволяют использовать контейнеры различных типов.
Рассмотрим Perl 6, который даже более динамично типизирован, чем Python, поскольку say 6 + "1";
дает 7
, целое число. (Кто подумал, что это хорошая идея, я не знаю.)
Мне нравится постепенный набор текста в моих программах, поскольку (особенно для Perl 6, который я изучаю) он улучшает читаемость и удобство обслуживания.
Ни одна из следующих работ:
use strict;
my Int $n = 6;
my Str $x = "a";
my Int @l = $n, $x;
ни
use strict;
my Int $n = 6;
my Str $x = "a";
my List @l = $n, $x;
Вы получаете Type check failed in assignment to @l; expected List but got Int
. (Другие синтаксисы построения списков ([vals]
, <vals>
) дают ту же ошибку).
Что работает, так это указание типа Any
(или Mu
), что имеет смысл. (Что ж, для меня это имеет смысл, потому что Any
то же самое ключевое слово использует Python 3.5.)
use strict;
my Int $n = 6;
my Str $x = "a";
my Any @l = $n, $x;
Но использование Any
или Mu
в первую очередь сводит на нет цель проверки типов.
Что это за список, если он не List
? Более того, почему my List $blah;
допустимый синтаксис, если проверка типа никогда не пройдет для какого-либо значения или его списка?
+
для чего-либо, кроме сложения чисел, является глупой идеей, наличие отдельного оператора для конкатенации строк имеет гораздо больший смысл. - person Brad Gilbert   schedule 25.01.2016perl6 -e 'say $*PERL.compiler'
)?my Int $n = 6;my Int @l = $n, $n;
у меня отлично работает (не заморачиваться ни с чем до 2015.12). Также почти нет причин иметьuse strict
в программе Perl 6, поскольку это значение по умолчанию. - person Brad Gilbert   schedule 25.01.2016rakudo (2015.12.219.gd.67.cb.3)
, но теперь я вижу ответ на этот вопрос. - person cat   schedule 25.01.2016+
, добавив к нему кандидатаmulti infix:<+> ( \l, Str \r ){ l~r }; say say 6 + "1"
= ›61
, но не делайте этого. - person Brad Gilbert   schedule 25.01.2016@l.WHAT.say
печатает(Array)
. - person Christopher Bottoms   schedule 25.01.2016