Difference between revisions of "Fold Assignment"

From CSE425S Wiki
Jump to navigation Jump to search
Line 11: Line 11:
 
[http://sml-family.org/Basis/list.html SML List Reference]  
 
[http://sml-family.org/Basis/list.html SML List Reference]  
 
===foldLeft===
 
===foldLeft===
<nowiki>public static <A, B> A foldLeft(BiFunction<A, B, A> f, A acc, ImmutableList<B> list)</nowiki> {{HofHof}}
+
<nowiki>public static <A, B> A foldLeft(BiFunction<A, B, A> f, A acc, ImmutableList<B> list)</nowiki> {{HofHof}}
 
:<code>foldLeft(f, initial_value, [x1, x2, ..., xn])</code>
 
:<code>foldLeft(f, initial_value, [x1, x2, ..., xn])</code>
 
:returns <code>f(xn,...,f(x2, f(x1, initial_value))...)</code> or <code>initial_value</code> if the list is empty.
 
:returns <code>f(xn,...,f(x2, f(x1, initial_value))...)</code> or <code>initial_value</code> if the list is empty.
  
 
===foldRight===
 
===foldRight===
<nowiki>public static <A, B> A foldRight(BiFunction<A, B, A> f, A acc, ImmutableList<B> list)</nowiki> {{HofHof}}
+
<nowiki>public static <A, B> A foldRight(BiFunction<A, B, A> f, A acc, ImmutableList<B> list)</nowiki> {{HofHof}}
 
:<code>foldRight(f, initial_value, [x1, x2, ..., xn])</code>
 
:<code>foldRight(f, initial_value, [x1, x2, ..., xn])</code>
 
:returns <code>f(x1, f(x2, ..., f(xn, init)...))</code> or <code>initial_value</code> if the list is empty.
 
:returns <code>f(x1, f(x2, ..., f(xn, init)...))</code> or <code>initial_value</code> if the list is empty.
Line 23: Line 23:
 
{{JavaToImplement|FoldHofApps|sum<br>countBetweenMinAndMaxExclusive|hof.map.assignment}}
 
{{JavaToImplement|FoldHofApps|sum<br>countBetweenMinAndMaxExclusive|hof.map.assignment}}
 
===sum===
 
===sum===
<nowiki>public static int sum(ImmutableList<Integer> xs)</nowiki>
+
<nowiki>public static int sum(ImmutableList<Integer> xs)</nowiki>
 
===countBetweenMinAndMaxExclusive===
 
===countBetweenMinAndMaxExclusive===
<nowiki>public static int countBetweenMinAndMaxExclusive(int min, int maxExclusive, ImmutableList<Integer> xs)</nowiki>
+
<nowiki>public static int countBetweenMinAndMaxExclusive(int min, int maxExclusive, ImmutableList<Integer> xs)</nowiki>
  
 
=Test=
 
=Test=
 
{{TestSuite|FoldTestSuite|hof.fold.assignment}}
 
{{TestSuite|FoldTestSuite|hof.fold.assignment}}

Revision as of 08:28, 30 July 2019

Lexical scope is not unique to ML. Nearly all programming languages use lexical scope, including Java.

First, we will build the utility methods: foldLeft (which can be easily built with tail recursion) and foldRight (which cannot).

Next, we will build some applications which use fold: sum (which does not require lexical scope) and countBetweenMinAndMaxExclusive (which does).

Code To Implement

Fold

class: FoldHof.java Java.png
methods: foldLeft
foldRight
package: hof.fold.assignment
source folder: src/main/java

SML List Reference

foldLeft

public static <A, B> A foldLeft(BiFunction<A, B, A> f, A acc, ImmutableList<B> list) Laurel Wreath
foldLeft(f, initial_value, [x1, x2, ..., xn])
returns f(xn,...,f(x2, f(x1, initial_value))...) or initial_value if the list is empty.

foldRight

public static <A, B> A foldRight(BiFunction<A, B, A> f, A acc, ImmutableList<B> list) Laurel Wreath
foldRight(f, initial_value, [x1, x2, ..., xn])
returns f(x1, f(x2, ..., f(xn, init)...)) or initial_value if the list is empty.

Fold Apps

class: FoldHofApps.java Java.png
methods: sum
countBetweenMinAndMaxExclusive
package: hof.map.assignment
source folder: src/main/java

sum

public static int sum(ImmutableList<Integer> xs)

countBetweenMinAndMaxExclusive

public static int countBetweenMinAndMaxExclusive(int min, int maxExclusive, ImmutableList<Integer> xs)

Test

class: FoldTestSuite.java Junit.png
package: hof.fold.assignment
source folder: src/test/java