Сначала я просто удивился, почему перед пустыми скобками в строке 2 этого кода стоит двоеточие (из Perl 6 Advent Calendar, 25 декабря 2018 г.)?
sub is-happy( $n is copy ) {
my $seen-numbers = :{};
while $n > 1 {
return False if $n ∈ $seen-numbers;
$seen-numbers{$n} = True;
$n = $n.comb.map(*²).sum
}
return True;
}
say is-happy(7); # True
say is-happy(2018); # False
Этот код запускается практически мгновенно. Я пытался say $seen-numbers.^name; и обнаружил, что это был Hash[Mu,Any].
Однако, когда я удаляю двоеточие, is-happy(7) возвращает True, но затем is-happy(2018) связывает процессор в течение нескольких минут (пока я не завершил процесс). Также, в этом случае, say $seen-numbers.^name; печатает Hash.
Итак, очевидно :{} приводит к созданию Hash[Mu,Any]. Как это работает? Это обходной путь или идиоматизм? А что такое Hash[Mu,Any] и как он сравнивается с обычным Hash?