// re-implements fold as a functional accumulator fun myFoldFunc(elements: List, initialResult: R, f: (R, E)->R): R { // helper that iterates through list // accumulator: result so far fun helpIterate(accumulator: R, remainingList: List): R { return when (remainingList.isEmpty()) { true -> accumulator false -> helpIterate( f(accumulator, remainingList[0]), remainingList.drop(1) ) } } return helpIterate( initialResult, elements ) } val mt = emptyList() val myNums = listOf(8, 6, 7, 5, 3, 0, 9) println("sum (nums): " + myFoldFunc(myNums, 0) { acc,e -> acc + e }) println("count (nums): " + myFoldFunc(myNums, 0) { acc,_ -> acc + 1 }) println("count (empty): " + myFoldFunc(mt, 0) { acc,_ -> acc + 1 }) println("max (nums): " + myFoldFunc(myNums, null) { acc,e -> maxOf(e, acc ?: e) }) println("max (mt): " + myFoldFunc(mt, null) { acc,e -> maxOf(e, acc ?: e) }) println() // re-implements fold as a functional accumulator fun myFold(elements: List, initialResult: R, f: (R, E)->R): R { return when (elements.isEmpty()) { true -> initialResult false -> myFold( elements.drop(1), f(initialResult, elements[0]), f ) } } println("sum (nums): " + myFold(myNums, 0) { acc,e -> acc + e }) println("count (nums): " + myFold(myNums, 0) { acc,_ -> acc + 1 }) println("count (empty): " + myFold(mt, 0) { acc,_ -> acc + 1 }) println("max (nums): " + myFold(myNums, null) { acc,e -> maxOf(e, acc ?: e) }) println("max (mt): " + myFold(mt, null) { acc,e -> maxOf(e, acc ?: e) }) println() // re-implement the list constructor! fun buildListImp(n: Int, f: (Int)->T): List { var myResult = mutableListOf() for (i in 0 until n) { myResult.add(f(i)) } return myResult } fun buildListFold(n: Int, f: (Int)->T): List { return (0 until n).fold(emptyList()) { acc,idx -> acc + listOf(f(idx)) } } println(buildListFold(5) { it + 1 }) println(buildListFold(5) { outer -> buildListFold(outer + 1) { inner -> buildListFold(inner+1, { "£" }).joinToString("") } })