我有一个任务,需要找到与目标字符串最接近的字符串(即编辑距离),但不要同时生成它们。我想使用高水位线技术(也可以说是低水位线技术),同时将最近的编辑距离初始化为Inf
,以确保任何编辑距离都更接近:
use Text::Levenshtein;
my @strings = < Amelia Fred Barney Gilligan >;
for @strings {
put "$_ is closest so far: { longest( 'Camelia', $_ ) }";
}
sub longest ( Str:D $target, Str:D $string ) {
state Int $closest-so-far = Inf;
state Str:D $closest-string = '';
if distance( $target, $string ) < $closest-so-far {
$closest-so-far = $string.chars;
$closest-string = $string;
return True;
}
return False;
}
然而,Inf
是一个Num,因此我不能这样做:
在对$closest-so-far赋值时类型检查失败;期望Int但得到了Num (Inf)
我可以将约束改为Num
并强制转换为它:
state Num $closest-so-far = Inf;
...
$closest-so-far = $string.chars.Num;
然而,这似乎非常不自然。由于Num
和Int
没有关联,我无法像Int(Num)
那样设置约束条件。实际上,我只关心第一个值。将其设置为足够大的某些值(例如最长字符串的长度)很容易,但我想要更纯粹的东西。
我是否漏掉了什么?我认为任何具有数字属性的东西都可以有一个特殊的值,比所有其他值都大(或小)。多态之类的。
Real
是由Int
和Num
两个角色扮演的,您对此有何看法? - Christoph