On Thu, 06 Apr 2017 13:46:00 -0700, alex.jakime...@gmail.com wrote:
> Code:
> my @a = <a b c>;
> my @b = <1 2 3>;
> my @c = @a, @b;
> say @c
> 
> Result:
> [[a b c] [1 2 3]]
> 
> 
> So with arrays, nothing is flattened and you get an array with two
> elements. Makes sense.
> 
> And if we want to get a different behavior, we can use slip:
> 
> Code:
> my @a = <a b c>;
> my @b = <1 2 3>;
> my @c = |@a, |@b;
> say @c
> 
> Result:
> [a b c 1 2 3]
> 
> 
> Everything is fine so far. Now, let's try the same thing with hashes:
> 
> Code:
> my %a = <a b c d>;
> my %b = <1 2 3 4>;
> my %c = %a, %b;
> say %c
> 
> Result:
> {1 => 2, 3 => 4, a => b, c => d}
> 
> 
> To me that looks like an inconsistency, I would have expected it to
> create a hash with one pair (%a => %b). In fact, both 「%c = %a, %b」
> and 「%c = |%a, |%b」 work exactly the same!
> 
> The idea of %a => %b may seem weird, but it really isn't if you
> consider object hashes (my %c{Hash} = %a => %b; or even my %c{Hash} =
> $%a, $%b)
> 
> Another thing to note is that this array behavior was changed during
> the GLR, but hashes remained the same. Perhaps that was an oversight.


The overwhelming majority of usecases would want merged hashes, not a hash 
keyed on another hash.

Also, there is consistency with Pairs:

    m: my %h = :2a, :3a; dd %h
    <camelia> rakudo-moar 605e9e: OUTPUT: «Hash %h = {:a(3)}␤»

Why would `Hash, Hash` end up as keyed on a Hash, when `Pair, Pair` gets merged?

This parallel is much closer than the Array one, so I'd argue it overrules the 
inconsistency with more distant types.

Reply via email to