提问人: 提问时间:7/20/2023 更新时间:7/20/2023 访问量:73
在Perl中定义部分函数的惯用方法吗?
Was is the idiomatic way to define partial functions in Perl?
问:
在Perl中定义部分函数的最常见/惯用方法是什么,即未在所有输入上定义的函数。例如,在 Haskell 中,我们有
safeHead :: [a] -> Maybe a
safeHead [] = Nothing
safeHead (x:xs) = Just x
在 C 语言中,我们有
int factorial(int n) {
assert(n >= 0);
int result = 1;
while (n) result *= n--;
return result;
}
或
int factorial(int n) {
if (n < 0) return -1;
int result = 1;
while (n) result *= n--;
return result;
}
我宁愿不导入CPAN模块。
答:
7赞
ikegami
7/20/2023
#1
就像在 C 语言中一样,你可以从 Perl subs 的中间返回。
sub factorial {
my $n = shift;
return -1 if $n < 0;
my $acc = 1;
$acc *= $_ for 2 .. $n;
return $acc;
}
断言样式:
sub factorial {
my $n = shift;
$n >= 0
or return -1;
my $acc = 1;
$acc *= $_ for 2 .. $n;
return $acc;
}
如果我在这里使用,我可能会返回而不是.对此返回值的任何误用都应该是干扰的。return
undef
-1
但我更有可能为无效输入抛出异常(使用 croak
)。
有关如何检查不同返回值的旁注。
if 条件 |
return false; return 0; return ""; return "0"; |
return undef; |
return; |
---|---|---|---|
my $x = f() |
错误条件 | 错误条件 | 错误条件 |
defined( my $x = f() ) |
真实状态 | 错误条件 | 错误条件 |
my ( $x ) = f() |
真实状态 | 真实状态 | 错误条件 |
评论
undef
-1
undef
die "factorial($n) is undefined" if $n < 0 or $n != int($n);
undef
effective.”, Only when the list can't contain .在这种情况下,您完全可以返回任何内容,而不是 .例如,以下循环直到迭代器不返回任何内容: 返回 false 值(例如 ,数字或字符串 )不会结束它。undef
undef
while ( my ( $element ) = $iter->() ) { ... }
undef
0
0