Perl 6 - Curried函数挂起

use*_*164 7 functional-programming currying perl6

因此,我希望能够编写一个功能,通过使用不同值的硬币,找出可以针对特定金额进行更改的所有方法.

所以,我写了一个函数coin,告诉你一个给定的数量,你可以为这个值做出多少改变,给定一个特定的值硬币,以及一个计算你可以改变多少种方式的函数,具有相同的类型下一个较小硬币的参数.

然后我尝试编写一个函数ladder,我想返回一个函数,对于硬币值的@array将返回一个函数需要一个形式参数$amt,该参数计算在给定值的情况下可以对该量进行更改的方式的数量数组中指定的硬币.

我尝试使用&coin带有.assuming方法的函数来添加硬币的值并构建适当的梯形图.不幸的是,当我尝试运行生成的函数时,它会挂起.

my @values = 2, 5, 10, 20, 50, 100, 200;
#the coin of value 1 is assumed as a base case

my &test = ladder(@values);

say &test(5);

sub ladder(@values) {
        my &base = sub () { return @values.shift };
        for @values {
                &base = &coin.assuming(*,$_,&base);
        }
        return &base;
}

sub coin($amt,$value,&lesser) {
        if $amt >= $value {
                return &coin($amt-$value,$value,&lesser) + &lesser($amt);
        } else {
                return &lesser($amt);
        }
}
Run Code Online (Sandbox Code Playgroud)

为了给出一个想法,它和梯子应该在下面的一系列功能中产生相当于&twopd.

sub twopd($amt) { return &coin($amt,200,&onepd) };

sub onepd($amt) { return &coin($amt,100,&fifp) };

sub fifp($amt) { return &coin($amt,50,&twep) };

sub twep($amt) { return &coin($amt,20,&tenp) };

sub tenp($amt) { return &coin($amt,10,&fivp) };

sub fivp($amt) { return &coin($amt,5,&twop) };

sub twop($amt) { return &coin($amt,2,&onep) };

sub onep($amt) { return 1 };
Run Code Online (Sandbox Code Playgroud)

我想知道是否有人可能知道我做错了什么.

Bra*_*ert 11

  • sub () { return @values.shift }将从@values每次调用时删除一个值,这不是你想要的.

  • &coin.assuming(*,$_,&base)需要做一些事情,&base以便它获得当前值,&base而不是在循环结束时留在其中的内容.一种选择是|在它前面添加,另一种选择是用于<>对值进行去包容.

添加一些缓存可能是个好主意,coin因为对于较大的值,它会多次使用相同的参数调用.

sub ladder ( +@ ($initial, *@values) ) {
    my &base = -> $ { $initial };
    for @values {
        &base = &coin.assuming: *,  $_, &base<>;
    }
    return &base;
}

use experimental :cached;

sub coin ( $amt, $value, &lesser ) is cached {
    if $amt >= $value {
        coin( $amt - $value, $value, &lesser ) + lesser($amt);
    } else {
        lesser( $amt );
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!我也注意到你写的是" - > $ {$ initial}"; 我注意到如果我省略了"$",它就不能正常工作(我得到"太多的位置传递;预期0个参数但得到1"错误).我试图在文档中找到"$"但找不到它."$"只是说lambda没有参数吗? (2认同)
  • @ user6189164`$`表示它需要一个值,但它不需要名称,因为它没有被使用. (2认同)