내가 사용하는 ',' 언제 '', '폴들레프트 레두셀프트 레두스라이트 폴드라이트 스칸레프트 사샤 라이트', '', '' 또는 ''?
I want 오버클로킹된 직관 / 개요입니다 일부 간단한 예제를 것으로 보도되기도 했다.
일반적으로 모든 6 배 총괄하였습니다 적용하십시오 각 요소에 이진 연산자를 뜻한다. 그 결과 전달됩니다 각 단계는 다음 단계 (1, 2 개의 입력으로 바이너리 operator& # 39 의 인수만). 쌓아 올린 이 길을 따라 수 있습니다.
'레두셀프트 레두스라이트 쌓아 올린' 와 '' 한 결과.
'시작' 가치 '와' 폴드라이트 폴들레프트 쌓아 올린 단일 사용한 결과.
'스칸레프트 컬렉션' 중간 '와' 사샤 라이트 쌓아 올린 누적 결과 값을 사용하여 시작.
'Abc' 요소 '와 함께 취합은 이진 탐색 기능을 추가할 수 있는 다른 배 앞으로 나갈 때 우리는 어떤 연산자입니다 못하며창조된 왼쪽에서 요소점 컬렉션 (A ~ C):
val abc = List("A", "B", "C")
def add(res: String, x: String) = {
println(s"op: $res + $x = ${res + x}")
res + x
}
abc.reduceLeft(add)
// op: A + B = AB
// op: AB + C = ABC // accumulates value AB in *first* operator arg `res`
// res: String = ABC
abc.foldLeft("z")(add) // with start value "z"
// op: z + A = zA // initial extra operation
// op: zA + B = zAB
// op: zAB + C = zABC
// res: String = zABC
abc.scanLeft("z")(add)
// op: z + A = zA // same operations as foldLeft above...
// op: zA + B = zAB
// op: zAB + C = zABC
// res: List[String] = List(z, zA, zAB, zABC) // maps intermediate results
< br>;
만약 우리가 적절한 요소점 시작하여 거꾸로 가고 있는 지금, ll 디이브이 we& # 39 의 캜 A) 의 두 번째 인수 이진 작동자 취합 결과는 (연산자에서 동일하기 때문에, 우리는 그냥 스위치 인수 이름은 그들의 역할을 할 수 있도록 선택해제합니다):
def add(x: String, res: String) = {
println(s"op: $x + $res = ${x + res}")
x + res
}
abc.reduceRight(add)
// op: B + C = BC
// op: A + BC = ABC // accumulates value BC in *second* operator arg `res`
// res: String = ABC
abc.foldRight("z")(add)
// op: C + z = Cz
// op: B + Cz = BCz
// op: A + BCz = ABCz
// res: String = ABCz
abc.scanRight("z")(add)
// op: C + z = Cz
// op: B + Cz = BCz
// op: A + BCz = ABCz
// res: List[String] = List(ABCz, BCz, Cz, z)
및 forwards.* (왼쪽부터)
하나님이 아닌 경우 일부 결과에 의해 드 쌓아 올린 * 빼기 왼쪽부터 요소점 모음을 통해 쌓아 올린 첫 번째 인수 'res' 결과, 우리는 우리의 이진 작동자 '마이너스':
val xs = List(1, 2, 3, 4)
def minus(res: Int, x: Int) = {
println(s"op: $res - $x = ${res - x}")
res - x
}
xs.reduceLeft(minus)
// op: 1 - 2 = -1
// op: -1 - 3 = -4 // de-cumulates value -1 in *first* operator arg `res`
// op: -4 - 4 = -8
// res: Int = -8
xs.foldLeft(0)(minus)
// op: 0 - 1 = -1
// op: -1 - 2 = -3
// op: -3 - 3 = -6
// op: -6 - 4 = -10
// res: Int = -10
xs.scanLeft(0)(minus)
// op: 0 - 1 = -1
// op: -1 - 2 = -3
// op: -3 - 3 = -6
// op: -6 - 4 = -10
// res: List[Int] = List(0, -1, -3, -6, -10)
< br>;
하지만 이제 변화를 위해 스라이트 조심해! 즉, 이 값이 누적 스라이트 전달되는 변형 (de-) 매개변수입니다 이진 빼기 ':') 의 두 번째 작동자 '' res
def minus(x: Int, res: Int) = {
println(s"op: $x - $res = ${x - res}")
x - res
}
xs.reduceRight(minus)
// op: 3 - 4 = -1
// op: 2 - -1 = 3 // de-cumulates value -1 in *second* operator arg `res`
// op: 1 - 3 = -2
// res: Int = -2
xs.foldRight(0)(minus)
// op: 4 - 0 = 4
// op: 3 - 4 = -1
// op: 2 - -1 = 3
// op: 1 - 3 = -2
// res: Int = -2
xs.scanRight(0)(minus)
// op: 4 - 0 = 4
// op: 3 - 4 = -1
// op: 2 - -1 = 3
// op: 1 - 3 = -2
// res: List[Int] = List(-2, 3, -1, 4, 0)
마지막 목록 (-2, 3, - 1, 4, 0) 가 너희는너희가 직관적으로 않을 수도 있을 것이다!
확인할 수 있듯이 어떤 너회의 폴데스 간단히 확인할 수 있습니다 및 디버그합니다 누적 결과 각 단계에서 스카누스 실행하는 대신 하고 있다.
그 결과 레두셀프트 레두스라이트 쌓아 올린 '또는' 을 (를) '-'. 그 결과 폴들레프트 쌓아 올린 '-' 와 '또는' 폴드라이트 있으면 시작 값.
쌓아 올린 '또는' 와 '중간 결과를 모아 스칸레프트 사샤 라이트'.
스라프트 사용하여 가려면 앞으로 통해 변화를 뜻한다.
일반적으로 데이터 축적 줄이는 방법은, 배, 스캔, 항상 왼쪽 변경에 대한 적절한 변수. 주된 차이를 줄일 때, 배 는 -
즉, 사용자 정의 '가치' 시드입니다 시작하여 접은 항상 시작 값입니다. 던질 수 있는 경우 다시 보기입니다 idfsysobject. 취합은 비워집니다 신지애 등 배 시드입니다 값이 된다. 가 단일 value. 항상 결과를
일부 처리 순서를 왼쪽 또는 오른쪽으로 스캑 사용할 수 있는 항목을 사용할 수 있고, 그 이전 결과 이어지는 것이다. 즉, 우리는 스캔할 수 있는 항목입니다. 항상 collection. 한 결과
LEFT_REDUCE 줄이는 방법은 비슷한 메서드입니다.
즉 취합, 항상 당장갑니다 변경에 대한 반대 레두셀프트 RIGHT_REDUCE 는 하나의 값을 왼쪽 편이다.
레두셀프트로티온 및 레두스라이트롭션 비슷합니다 차이는 left_reduce 및 right_reduce 디렉토리에만 돌아올 결과 옵션에만 객체에는.
아래에 언급된 코드 일부를 위한 출력입니다 약간만이라도: -
'스캔' 작업을 통해 사용하여 숫자 목록 (시드입니다 '가치' 를 사용하여 '0') '목록 (-2, - 1.0,1.2)'
{0}, {1} = - = > - 2 - 2 - 2, 3}, {{- = - 3 - 3.1; - > 3.0 > > &2 {}} = 2.2; - 0 = - >, 검색 목록 (0, - 2 - 3 - 3 - 2, 0)
{0}, {1} = - = > - 2 - 2 - 2, 3}, {{- = - 3 - 3.1; - > 3.0 > > &2 {}} = - = 2.2; 0; - (a+b) > 스칸레프트 목록 (, - 2 - 3 - 0 - 3, 2, 0)
{0}, {1} = - = > - 2 - 2 - 2, 3}, {{- = - 3 - 3.1; - > 3.0 > > &2 {}} = - = 2.2 스칸레프트 > 0; - (b+a) 목록 (, - 2 - 3 - 0 - 3, 2, 0)
{} {1.2}, {3} > > 2.0), 2 = = = = {1.3} - {- > 0.3 > 3; 0, 2} = 2.2 > 사샤 라이트 (a+b) 목록 (0, 2, 3, 3, 2, 0)
{} {1.2}, {3} > > 2.0), 2 = = = = {1.3} - {- > 0.3 > 3; 0, 2} = 2.2 > 사샤 라이트 (b+a) 목록 (0, 2, 3, 3, 2, 0)
'', '배' 목록을 통해 작업을 통해 절감하십시오 문장열 '목록 (", A", ", B";;;;;; E" " C" " D" ")'
= {C}} - {A, B, AB, AB, ABC > > = {}}, {사용권한집합내의 ABC, D, E =, = > > (a+b) ABCDE ABCDE 절감하십시오 룸멤버쉽 = {C}} - {A, B, AB, AB, ABC > > = {}}, {ABC, D, E =, = > > ABCDE 레두셀프트 (a+b) ABCDE 사용권한집합내의 룸멤버쉽 -}, {C}, {A, B = > {} =, = > 배지요 배지요 CBA, D, E = {}, CBA > 데코바 데코바 > 에드코바 에드크비 레두셀프트 (b+a).
코드:
object ScanFoldReduce extends App {
val list = List("A","B","C","D","E")
println("reduce (a+b) "+list.reduce((a,b)=>{
print("{"+a+","+b+"}=>"+ (a+b)+" ")
a+b
}))
println("reduceLeft (a+b) "+list.reduceLeft((a,b)=>{
print("{"+a+","+b+"}=>"+ (a+b)+" ")
a+b
}))
println("reduceLeft (b+a) "+list.reduceLeft((a,b)=>{
print("{"+a+","+b+"}=>"+ (b+a)+" " )
b+a
}))
println("reduceRight (a+b) "+list.reduceRight((a,b)=>{
print("{"+a+","+b+"}=>"+ (a+b)+" " )
a+b
}))
println("reduceRight (b+a) "+list.reduceRight((a,b)=>{
print("{"+a+","+b+"}=>"+ (b+a)+" ")
b+a
}))
println("scan "+list.scan("[")((a,b)=>{
print("{"+a+","+b+"}=>"+ (a+b)+" " )
a+b
}))
println("scanLeft (a+b) "+list.scanLeft("[")((a,b)=>{
print("{"+a+","+b+"}=>"+ (a+b)+" " )
a+b
}))
println("scanLeft (b+a) "+list.scanLeft("[")((a,b)=>{
print("{"+a+","+b+"}=>"+ (b+a)+" " )
b+a
}))
println("scanRight (a+b) "+list.scanRight("[")((a,b)=>{
print("{"+a+","+b+"}=>"+ (a+b)+" " )
a+b
}))
println("scanRight (b+a) "+list.scanRight("[")((a,b)=>{
print("{"+a+","+b+"}=>"+ (b+a)+" " )
b+a
}))
//Using numbers
val list1 = List(-2,-1,0,1,2)
println("reduce (a+b) "+list1.reduce((a,b)=>{
print("{"+a+","+b+"}=>"+ (a+b)+" ")
a+b
}))
println("reduceLeft (a+b) "+list1.reduceLeft((a,b)=>{
print("{"+a+","+b+"}=>"+ (a+b)+" ")
a+b
}))
println("reduceLeft (b+a) "+list1.reduceLeft((a,b)=>{
print("{"+a+","+b+"}=>"+ (b+a)+" " )
b+a
}))
println(" reduceRight (a+b) "+list1.reduceRight((a,b)=>{
print("{"+a+","+b+"}=>"+ (a+b)+" " )
a+b
}))
println(" reduceRight (b+a) "+list1.reduceRight((a,b)=>{
print("{"+a+","+b+"}=>"+ (b+a)+" ")
b+a
}))
println("scan "+list1.scan(0)((a,b)=>{
print("{"+a+","+b+"}=>"+ (a+b)+" " )
a+b
}))
println("scanLeft (a+b) "+list1.scanLeft(0)((a,b)=>{
print("{"+a+","+b+"}=>"+ (a+b)+" " )
a+b
}))
println("scanLeft (b+a) "+list1.scanLeft(0)((a,b)=>{
print("{"+a+","+b+"}=>"+ (b+a)+" " )
b+a
}))
println("scanRight (a+b) "+list1.scanRight(0)((a,b)=>{
print("{"+a+","+b+"}=>"+ (a+b)+" " )
a+b}))
println("scanRight (b+a) "+list1.scanRight(0)((a,b)=>{
print("{"+a+","+b+"}=>"+ (a+b)+" " )
b+a}))
}