2016-05-16 3 views
0

Я знаю, этот вопрос уже задан. Но я не понял ни одного ответа. Думаю, мне нужно более подробное объяснение. Я не могу понять, как «мостить» FoldLeft с FoldRight. Меня не волнует, нет ли анвера в функциональном программировании в Scala. Thabk вы очень заблаговременно.FoldLeft через FoldRight в Scala снова

+1

Какие ответы вы не понимаете? Что * * * вы понимаете foldLeft и foldRight? Что вы подразумеваете под «мостом»? – pedrofurla

+0

Не только это было задано и уже ответили, но было предложено этим утром, но этот вопрос, кажется, был удален. Странный. Во всяком случае, вам нужно объяснить, каким образом другие недостаточно для вас, или это быстро закрывается как дубликат. Или вы тот же пользователь, который спросил и удалил другой вопрос, или какой-то курс установил это как назначение. В последнем случае вам действительно нужно что-то попробовать и опубликовать, когда вы застряли –

+0

@pedrofurla, если это похоже на другой вопрос, речь идет о реализации foldLeft с точки зрения foldRight (и наоборот) –

ответ

1

Просто проверить, как те, которые реализуются:

def foldLeft[B](z: B)(op: (B, A) => B): B = { 
    var result = z 
    this foreach (x => result = op(result, x)) 
    result 
    } 

    def foldRight[B](z: B)(op: (A, B) => B): B = 
    reversed.foldLeft(z)((x, y) => op(y, x)) 

foldLeft траверса коллекции слева направо, применяя op к элементу result и тока, в то время как foldRight траверсов перевернутой коллекции (т.е. справа налево).

Когда op симметрично и транзитивно foldLeft и foldRight эквивалентны, например:

List(1,2,3).foldLeft(0)(_ + _) 
List(1,2,3).foldRight(0)(_ + _) 

Результат:

res0: Int = 6 
res1: Int = 6 

Но в противном случае foldLeft и foldRight может производить различные результаты:

List(1,2,3).foldLeft(List[Int]()){case (list, el) => list :+ el } 
List(1,2,3).foldRight(List[Int]()){case (el, list) => list :+ el } 

res2: List[Int] = List(1, 2, 3) 
res3: List[Int] = List(3, 2, 1) 
+0

То, что я пытался сказать, это то, что Я не понимаю даже то, что означает «Fold Left в терминах Fold Right». Я знаю, как они работают, но я не понимаю, если foldleftviafoldright означает инкапсулировать одно внутри другого, если это означает, что я использую операцию Left To Right, но используя Fold Right. –

+0

Кроме того, я не знаю, как это сделать, я знаю, как это сделать, но я не очень хорошо это понимаю. Извините за мой взгляд, я не программист на английском языке и программист FP. –