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

示例:数组方法可以在test_arr()中看到,而哈希方法可以在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;
}

最佳答案

确实与数组相同:

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;
}

请注意,您还可以编写%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;
}

但是不要夸大它。 Perl 6的类型不如Haskell强,并且试图表现得好像并不会带来良好的编码体验。

关于raku - Perl6 : Sub: restrict to static hash-return type,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49203751/

10-11 06:53