在Perl中定义部分函数的惯用方法吗?

Was is the idiomatic way to define partial functions in Perl?

提问人: 提问时间:7/20/2023 更新时间:7/20/2023 访问量:73

问:

在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模块。

Perl 习语

评论

1赞 Jonathan Leffler 7/20/2023
考虑在结果未定义时是否返回。我不确定是否有标准约定,但返回阶乘会起作用。空列表的头部可能会有效地返回。等。undef-1undef
0赞 7/20/2023
@JonathanLeffler我没有想到 undef,这是有道理的,我使用的是die "factorial($n) is undefined" if $n < 0 or $n != int($n);
0赞 ikegami 7/20/2023
@Jonathan Leffler, Re “The head of an empty list might return undef effective.”, Only when the list can't contain .在这种情况下,您完全可以返回任何内容,而不是 .例如,以下循环直到迭代器不返回任何内容: 返回 false 值(例如 ,数字或字符串 )不会结束它。undefundefwhile ( my ( $element ) = $iter->() ) { ... }undef00
0赞 Jonathan Leffler 7/20/2023
@ikegami - 是的,这很大程度上取决于列表的性质。还有其他警告没有提到,无论是在我的原始评论中还是在它的附录中。

答:

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

如果我在这里使用,我可能会返回而不是.对此返回值的任何误用都应该是干扰的。returnundef-1

但我更有可能为无效输入抛出异常(使用 croak)。


有关如何检查不同返回值的旁注。

if条件 return false;
return 0;
return "";
return "0";
return undef; return;
my $x = f() 错误条件 错误条件 错误条件
defined( my $x = f() ) 真实状态 错误条件 错误条件
my ( $x ) = f() 真实状态 真实状态 错误条件