라쿠에서 이중 합산 시퀀스 표현


13

Perl 6에서 이중 변수 이중 합산 시퀀스 를 표현하는 방법은 무엇입니까?

이중 변수 이중 합산 시퀀스 의 예는 다음을 참조하십시오.

영상

즉, 이중 합산을 수학적으로 단일 합산으로 줄이지 않고 그대로 표현해야합니다. 감사합니다.

답변:


14

X(크로스 연산자)과 [+](환원 metaoperator [ ]첨가제 연산자는 +)이 의외로 쉽게합니다

표현하기 위해 1을 두 번 요약 Σ³ X  = 1 Σ⁵의 Y  = 1 + y로 다음을 수행 할 수 있습니다 :

  [+] do for 1..3 X 1..5 -> ($x, $y) { 2 * $x + $y }
#        for 1..3 X 1..5                             # loop cross values
#                        -> ($x, $y)                 # plug into x/y
#                                    { 2 * $x + $y } # calculate each iteration
#     do                                             # collect loop return vals 
# [+]                                                # sum them all

이를 위해을 만들려면 sub다음과 같이 쓸 수 있습니다. 2

sub ΣΣ (
    Int $aₒ, Int $aₙ,     # to / from for the outer
    Int $bₒ, Int $bₙ,     # to / from for the inner
    &f where .arity = 2   # 'where' clause guarantees only two params
) {
  [+] do for $aₒ..$aₙ X $bₒ..$bₙ -> ($a, $b) { &f(a,b) }
}

say ΣΣ 1,3, 1,5, { 2 * $^x + $^y }

또는 더 단순화하기 위해

sub ΣΣ (
    Iterable \a,            # outer values
    Iterable \b,            # inner values
    &f where .arity = 2) {  # ensure only two parameters
  [+] do f(|$_) for a X b
}

# All of the following are equivalent
say ΣΣ 1..3, 1..5, -> $x, $y { 2 * $x  + $y  }; # Anonymous block
say ΣΣ 1..3, 1..5,           { 2 * $^x + $^y }; # Alphabetic args
say ΣΣ 1..3, 1..5,             2 *  *  +  *   ; # Overkill, but Whatever ;-) 

이를 입력하면 범위가 전달 될 수 있지만, 입력하는 Iterable것보다 Range더 흥미로운 합산 시퀀스를 허용 할 수있는 것보다 범위를 입력 ΣΣ (1..∞).grep(*.is-prime)[^99], 1..10, { … }하면 처음 100 개의 소수를 사용할 수 있습니다.

실제로 원한다면, 우리는 오버 보드를 할 수 있고, 임의의 깊이 합산 연산자를 허용 할 수 있습니다.

sub ΣΣ (
    &function, 
    **@ranges where                # slurp in the ranges
        .all   ~~ Iterable &&      # make sure they're Iterables 
        .elems == &function.arity  # one per argument in the function
) {
  [+] do function(|$_) for [X] @ranges;
};

함수 [+]의 모든 값을 합산하는 것처럼 교차를 반복적으로 계산합니다 (예 : 먼저 또는 , 그런 다음 , 또는) . f()[X][X] 0..1, 3..4, 5..60..1 X 3..4(0,3),(0,4),(1,3),(1,4)(0,3),(0,4),(1,3),(1,4) X 5..6(0,3,5),(0,4,5),(1,3,5),(1,4,5),(0,3,6),(0,4,6),(1,3,6),(1,4,6)


1. 죄송합니다. LaTeX를 사용하도록 허용하지는 않지만 아이디어를 얻어야합니다. 2. 네, 첨자 문자 O가 0이 아니라는 것을 알고 있습니다. 첨자 번호는 일반적으로 유효한 식별자가 아니지만 Slang :: Subscripts 를 사용하여 활성화 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.