2016-08-03 6 views
6

내가 싫어하는 한, 하이퍼 연산자 »map()의 지름길입니다. 왜 다음과 같은 결과가 나올까요? 두 번째 예제에서는 .sum이 적용되지 않는 것 같습니다.Perl6 hyper»연산자가지도처럼 작동하지 않습니다.

say ([1,2], [2, 2], [3, 3]).map({.sum}); 
# (3 4 6) 
say ([1,2], [2, 2], [3, 3])».sum; 
# ([1 2] [2 2] [3 3]) 

답변

6

하이퍼 스는 재귀 적으로 하위 목록으로 내려갑니다. 또한 그들은 자동 작업 (NYI)을위한 후보자로서 그들의 작전이 순조롭게 진행되지 않는다는 것을 의미합니다.

또한 https://github.com/rakudo/rakudo/commit/c8c27e93d618bdea7de3784575d867d9e7a2f6cb으로 수정 된 버그가있었습니다.

say ([1,2], [2, 2], [3, 3])».sum; 
# (3 4 6) 
+2

모두 사실이지만, hyperoperator가 하부 구조로 반드시 내려갈 필요는 없습니다 (cf'say ([1,2], [2, 2], [3,3]). 틀림없이,'List.sum'은'is nodal' 주석이 없습니다 ... – Christoph

5

TL은, DR 당신은 거의 확실히 버그가 발생했습니다. 즉, map» 하이퍼 프는 큰 차이가 있습니다.

mapSeq을 반환합니다. - 순환 부에 하강하지 map 데이터 구조

  • 한 레벨의 딥 (순회가 얕은이 Seq 데이터 구조 공급되는 사용자의 각 요소를 사용자가 제공 한 코드를 적용하는 결과를 얻을 한번에 데이터 구조의 최상위)
  • 하나의 구조 (모두가 순차적으로 수행되지 map 즉시 반환 평행 아무것도) 느리게
  • (된다 사용자 공급 코드는 이후 결과를 생성하기 위해 사용자가 제공 한 데이터 구조에 적용 Seq에서 값을 가져 오는 데 필요한만큼)

» hyperop은의 데이터 구조 피연산자를 반환 그 좌측 제 데이터 구조의 요소의 오른쪽에서 단항 연산을 적용한 후 :

  • 하나만 레벨 또는leaves로 하강 깊은 단항 연산에 의해 지시 된대로
  • 적어도 병렬 적으로 (적어도 의미 상으로) (프로그래머는 파라메터의 여러 요소에 적용 할 때 올바른 결과를 산출하는 단항 연산을 선택해야합니다 당신이 "nodal" 인 단항 연산자를 (적용하는 경우 단항 연산자는

) 전체 데이터 구조에 적용되었을 때 임의의 순서로 llel) 열심히

  • 의 (a map 호출 달리 하이퍼 연산 만 반환 그래서 hyperoperation은 내려 오지 않기를 선택할 것입니다.) 또는 데이터 구조는 오직 하나의 깊이만큼 깊이가 있습니다. (그래서 hyperoperation이 하강하기위한 더 낮은 레벨의 잎이 없습니다) 그리고 hyperoperation과 단항 연산자를 가진 map의 차이점은 순차/병렬 및 지연/열망 측면.

    sum은 노드 조작자 여야합니다. 그렇지 않으면 개별 나뭇잎에 도착할 때까지 하위 구조로 내려 가며 무의미한 단일 값 묶음에 적용되게됩니다. ETA : 이제 수정 된 것 같습니다.