Perl6:Sub:限制为静态哈希返回类型

byt*_*nit 7 perl6

我想限制Perl6中某些函数的返回类型.我知道,如何推断函数的正确返回类型,在Perl6中返回标量或数组,但我不知道,如果我使用特定类型的散列作为返回值,我该怎么做呢?

示例:可以看到Array方法,可以看到test_arr()Hash方法test_hash().所以我想指定返回值test_hash(),返回A类的哈希值.

#!/usr/bin/env perl6
use v6.c;
use fatal;

class A { 
    has Str $.member;
}

sub test_arr() returns Array[A] {
    my A @ret;
    @ret.push(A.new(member=>'aaa'));
    return @ret;
}

sub test_hash() { #TODO: add `returns FANCY_TYPE`
    my A %ret;
    %ret.append("elem",A.new(member=>'aaa'));
    %ret.append("b",A.new(member=>'d'));
    return %ret;
}

sub MAIN() returns UInt:D {
    say test_arr().perl;
    say test_hash().perl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

mor*_*itz 6

它与数组真的相同:

sub test_hash() returns Hash[A] {
    my A %ret;
    %ret.append("elem",A.new(member=>'aaa'));
    %ret.append("b",A.new(member=>'d'));
    return %ret;
}
Run Code Online (Sandbox Code Playgroud)

请注意,您也可以写%ret<elem> = A.new(...).

更新:对于数组的哈希A,你需要基本上做同样的事情,你只需要明确每一步的类型:

sub test_hash() returns Hash[Array[A]] {
    my Array[A] %ret;
    %ret<elem> = Array[A].new(A.new(member => 'aaa'));
    return %ret;
}
Run Code Online (Sandbox Code Playgroud)

但不要夸大它; Perl 6并不像Haskell那样强类型,并试图表现得好像不会带来良好的编码体验.