fun foldLeft(l: List, seed: B, func: (b: B, a: A) -> B) : B { return when { l.isEmpty() -> seed else -> foldLeft(l.tail, func(seed, l.head), func) } } fun foldRightOverflows(l: List, seed: B, func: (a: A, b: B) -> B) : B { return when { l.isEmpty() -> seed else -> func(l.head, foldRightOverflows(l.tail, seed, func)) } } fun foldRight(l: List, seed: T, func: (a: T, b: T) -> T) : T { return foldLeft(l.asReversed(), seed, func) }