gpt4 book ai didi

raku - Perl 6 有无限的 Int 吗?

转载 作者:行者123 更新时间:2023-12-04 04:02:22 24 4
gpt4 key购买 nike

我有一个任务,我想找到最接近目标的字符串(所以,编辑距离),而不是同时生成它们。我想在将最近的编辑距离初始化为 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;
}

但是, InfNum所以我不能这样做:

Type check failed in assignment to $closest-so-far; expected Int but got Num (Inf)



我可以将约束设为 Num并强制这样做:
    state Num $closest-so-far = Inf;
...
$closest-so-far = $string.chars.Num;

然而,这似乎很不自然。而且,由于 NumInt不相关,我不能有像 Int(Num) 这样的约束.我只关心第一个值。将其设置为足够高的值很容易(例如最长字符串的长度),但我想要更纯粹的东西。

有什么我想念的吗?我会认为任何数字事物都可能具有大于(或小于)所有其他值的特殊值。多态性等等。

最佳答案

{希望比无用/误导性的原始介绍更好的新介绍}
@CarlMäsak,在 a comment he wrote below this answer在我的第一个版本之后:

Last time I talked to Larry about this {in 2014}, his rationale seemed to be that ... Inf should work for all of Int, Num and Str


(我的回答的第一个版本以“记忆”开头,我得出的结论是至少没有帮助,而且似乎是完全错误的内存。)
在我针对 Carl 的评论进行的研究中,我确实在 #perl6-dev in 2016 中找到了一个相关的 gem 。当拉里写道:

then our policy could be, if you want an Int that supports ±Inf and NaN, use Rat instead

in other words, don't make Rat consistent with Int, make it consistent with Num


拉里写了这篇文章 6.c .我不记得看到过类似的讨论 for 6.d .
{现在回到我的第一个答案的其余部分}
Num在 P6 中实现了 IEEE 754 浮点数类型。根据 IEEE 规范,这种类型必须支持几个具体值,这些值保留代表抽象概念,包括正无穷大的概念。 P6 将相应的具体值绑定(bind)到术语 Inf .
鉴于这个表示无穷大的具体值已经存在,对于不涉及浮点数的情况(例如在字符串和列表函数中传递无穷大),它成为一种语言范围内的通用具体值表示无穷大。

我在下面建议的解决您的问题的方法是使用 where通过 subset 的子句.
一个 where clause允许指定运行时分配/绑定(bind)“类型检查”。我引用“typecheck”是因为它可能是最强大的检查形式——它是 computationally universal。并从字面上检查实际的运行时值(而不是该值可以是什么的静态类型 View )。这意味着他们是 slower和运行时,而不是编译时,但它也使它们比 dependent types 更强大(更不用说更容易表达)这是一个相对前沿的功能,那些使用高级静态类型检查语言的人倾向于声称仅在他们自己的世界中可用1,并且旨在“通过允许极具表现力的类型来防止错误”(但祝你好运,弄清楚如何表达它们... ;))。
一个 subset declaration可以包含 where条款。这允许您命名检查并将其用作命名类型约束。
因此,您可以使用这两个功能来获得您想要的:
subset Int-or-Inf where Int:D | Inf;
现在只需使用 subset作为一种类型:
my Int-or-Inf $foo; # ($foo contains `Int-or-Inf` type object) 
$foo = 99999999999; # works
$foo = Inf; # works
$foo = Int-or-Inf; # works
$foo = Int; # typecheck failure
$foo = 'a'; # typecheck failure
1. 见 Does Perl 6 support dependent types?it seems the rough consensus is no .

关于raku - Perl 6 有无限的 Int 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45258965/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com