Difference between revisions of "Higher Order Functions Hall of Fame Assignment"

From CSE425S Wiki
Jump to navigation Jump to search
 
(10 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
=Code To Implement=
 
=Code To Implement=
==MapHof==
+
==Higher-order Functions==
===map===
+
{{JavaToImplement|Hof|filter<br/>foldLeft<br/>foldRight<br/>map<br/>find<br/>|hof.util.exercise}}
{{JavaToImplement|MapHof|map|hof.map.util.exercise}}
 
  
<nowiki>public static <T, R> ImmutableList<R> map(Function<T, R> f, ImmutableList<T> list)</nowiki> {{HofHof}}
+
===filter {{HofHof}}===
 +
[https://smlfamily.github.io/Basis/list.html#SIG:LIST.filter:VAL SML List filter]
  
[https://smlfamily.github.io/Basis/list.html#SIG:LIST.map:VAL SML List map]
+
<syntaxhighlight lang="java>
 +
public static <E> ImList<E> filter(Predicate<E> predicate, ImList<E> list)
 +
</syntaxhighlight>
  
==MapHofApps==
+
===foldLeft {{HofHof}}===
{{JavaToImplement|MapHofApps|mapToLengths<br>mapToStrictlyLessThan|hof.map.client.exercise}}
+
[https://smlfamily.github.io/Basis/list.html#SIG:LIST.foldl:VAL SML List foldl]
  
===mapToLengths===
+
:<code>foldLeft(f, initial_value, [x1, x2, ..., xn])</code>
<nowiki>public static ImmutableList<Integer> mapToLengths(ImmutableList<String> texts)</nowiki>
+
:returns <code>f(xn,...,f(x2, f(x1, initial_value))...)</code> or <code>initial_value</code> if the list is empty.
  
Use the [https://docs.oracle.com/javase/8/docs/api/java/lang/String.html String] class's [https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#length-- length()] method.
+
<syntaxhighlight lang="java>
 +
public static <E, R> R foldLeft(BiFunction<E, R, R> f, R acc, ImList<E> list)
 +
</syntaxhighlight>
 +
===foldRight {{HofHof}}===
 +
[https://smlfamily.github.io/Basis/list.html#SIG:LIST.foldr:VAL SML List foldr]
  
===mapToStrictlyLessThan===
+
:<code>foldRight(f, initial_value, [x1, x2, ..., xn])</code>
<nowiki>public static ImmutableList<Boolean> mapToStrictlyLessThan(ImmutableList<Integer> xs, int threshold)</nowiki>
+
:returns <code>f(x1, f(x2, ..., f(xn, init)...))</code> or <code>initial_value</code> if the list is empty.
  
==FilterHof==
+
<syntaxhighlight lang="java>
===filter===
+
public static <E, R> R foldRight(BiFunction<E, R, R> f, R acc, ImList<E> list)
{{JavaToImplement|FilterHof|filter|hof.filter.util.exercise}}
+
</syntaxhighlight>
 +
===map {{HofHof}}===
 +
[https://smlfamily.github.io/Basis/list.html#SIG:LIST.map:VAL SML List map]
  
<nowiki>public static <E> ImmutableList<E> filter(Predicate<E> predicate, ImmutableList<E> list)</nowiki> {{HofHof}}
+
<syntaxhighlight lang="java>
 +
public static <E, R> ImList<R> map(Function<E, R> f, ImList<E> list)
 +
</syntaxhighlight>
 +
===find {{HofHof}}===
 +
[https://smlfamily.github.io/Basis/list.html#SIG:LIST.find:VAL SML List map]
  
[https://smlfamily.github.io/Basis/list.html#SIG:LIST.filter:VAL SML List filter]
+
<syntaxhighlight lang="java>
 +
public static <E> Optional<E> find(Predicate<E> predicate, ImList<E> list)
 +
</syntaxhighlight>
  
==FilterHofApps==
+
==Clients==
{{JavaToImplement|FilterHofApps|filterWordsWhichContainAllVowels<br>filterEvens|hof.map.client.exercise}}
+
{{JavaToImplement|HofClients|toOnlyWordsWhichContainAllVowels<br>firstPalindrome<br/>sum<br>countBetweenMinAndMaxExclusive<br/>reverse<br>toLengths<br/>toStrictlyLessThan|hof.clients.exercise}}
  
<nowiki>public static ImmutableList<String> filterWordsWhichContainAllVowels(ImmutableList<String> words)</nowiki>
+
===toOnlyWordsWhichContainAllVowels===
 +
<syntaxhighlight lang="java>
 +
public static ImList<String> toOnlyWordsWhichContainAllVowels(ImList<String> words)
 +
</syntaxhighlight>
  
<nowiki>public static ImmutableList<Integer> filterEvens(ImmutableList<Integer> xs)</nowiki>
+
===toOnlyEvens===
 +
<syntaxhighlight lang="java>
 +
public static ImList<Integer> toOnlyEvens(ImList<Integer> xs)
 +
</syntaxhighlight>
  
==FoldHof==
+
===toOnlyWordsWhichContainAllVowels===
<!--
+
<syntaxhighlight lang="java>
Lexical scope is not unique to ML.  Nearly all programming languages use lexical scope, including Java. 
+
public static ImList<String> toOnlyWordsWhichContainAllVowels(ImList<String> words)
 +
</syntaxhighlight>
  
First, we will build the utility methods: foldLeft (which can be easily built with tail recursion) and foldRight (which cannot).
+
===firstPalindrome===
 +
<syntaxhighlight lang="java>
 +
public static Optional<String> firstPalindrome(ImList<String> words)
 +
</syntaxhighlight>
  
Next, we will build some applications which use fold: sum (which does not require lexical scope) and countBetweenMinAndMaxExclusive (which does).
+
===sum===
-->
+
<syntaxhighlight lang="java>
{{JavaToImplement|FoldHof|foldLeft<br>foldRight|hof.fold.util.exercise}}
+
public static int sum(ImList<Integer> xs)
 
+
</syntaxhighlight>
===foldLeft===
 
<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>
 
:returns <code>f(xn,...,f(x2, f(x1, initial_value))...)</code> or <code>initial_value</code> if the list is empty.
 
 
 
[https://smlfamily.github.io/Basis/list.html#SIG:LIST.foldl:VAL SML List foldl]
 
  
===foldRight===
 
<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>
 
:returns <code>f(x1, f(x2, ..., f(xn, init)...))</code> or <code>initial_value</code> if the list is empty.
 
 
[https://smlfamily.github.io/Basis/list.html#SIG:LIST.foldr:VAL SML List foldr]
 
 
==Fold Apps==
 
{{JavaToImplement|FoldHofApps|sum<br>countBetweenMinAndMaxExclusive|hof.map.client.exercise}}
 
===sum===
 
<nowiki>public static int sum(ImmutableList<Integer> xs)</nowiki>
 
 
===countBetweenMinAndMaxExclusive===
 
===countBetweenMinAndMaxExclusive===
<nowiki>public static int countBetweenMinAndMaxExclusive(int min, int maxExclusive, ImmutableList<Integer> xs)</nowiki>
+
<syntaxhighlight lang="java>
 
+
public static int countBetweenMinAndMaxExclusive(int min, int maxExclusive, ImList<Integer> xs)
==FindHof==
+
</syntaxhighlight>
===find===
 
{{JavaToImplement|FindHof|find|hof.find.util.exercise}}
 
  
<nowiki>public static <E> Optional<E> find(Predicate<E> predicate, ImmutableList<E> list)</nowiki> {{HofHof}}
+
===reverse===
 
+
<syntaxhighlight lang="java>
[https://smlfamily.github.io/Basis/list.html#SIG:LIST.find:VAL SML List map]
+
public static <E> ImList<E> reverse(ImList<E> xs)
 +
</syntaxhighlight>
  
==FindHofApps==
+
===toLengths===
{{JavaToImplement|FindHofApps|findFirstPalindrome|hof.find.client.exercise}}
+
<syntaxhighlight lang="java>
 +
public static ImList<Integer> toLengths(ImList<String> texts)
 +
</syntaxhighlight>
  
===findFirstPalindrome===
+
===toStrictlyLessThan===
<nowiki>public static Optional<String> findFirstPalindrome(ImmutableList<String> words)</nowiki>
+
<syntaxhighlight lang="java>
 +
public static ImList<Boolean> toStrictlyLessThan(ImList<Integer> xs, int threshold)
 +
</syntaxhighlight>
  
 
=Test=
 
=Test=
 
{{TestSuite|HigherOrderFunctionTestSuite|hof}}
 
{{TestSuite|HigherOrderFunctionTestSuite|hof}}
==Map==
 
{{TestSuite|MapTestSuite|hof.map}}
 
==Filter==
 
{{TestSuite|FilterTestSuite|hof.filter}}
 
==Fold==
 
{{TestSuite|FoldTestSuite|hof.fold}}
 
==Filter==
 
{{TestSuite|FindTestSuite|hof.find}}
 

Latest revision as of 03:32, 12 October 2023

Code To Implement

Higher-order Functions

class: Hof.java Java.png
methods: filter
foldLeft
foldRight
map
find
package: hof.util.exercise
source folder: src/main/java

filter Laurel Wreath

SML List filter

public static <E> ImList<E> filter(Predicate<E> predicate, ImList<E> list)

foldLeft Laurel Wreath

SML List foldl

foldLeft(f, initial_value, [x1, x2, ..., xn])
returns f(xn,...,f(x2, f(x1, initial_value))...) or initial_value if the list is empty.
public static <E, R> R foldLeft(BiFunction<E, R, R> f, R acc, ImList<E> list)

foldRight Laurel Wreath

SML List foldr

foldRight(f, initial_value, [x1, x2, ..., xn])
returns f(x1, f(x2, ..., f(xn, init)...)) or initial_value if the list is empty.
public static <E, R> R foldRight(BiFunction<E, R, R> f, R acc, ImList<E> list)

map Laurel Wreath

SML List map

public static <E, R> ImList<R> map(Function<E, R> f, ImList<E> list)

find Laurel Wreath

SML List map

public static <E> Optional<E> find(Predicate<E> predicate, ImList<E> list)

Clients

class: HofClients.java Java.png
methods: toOnlyWordsWhichContainAllVowels
firstPalindrome
sum
countBetweenMinAndMaxExclusive
reverse
toLengths
toStrictlyLessThan
package: hof.clients.exercise
source folder: src/main/java

toOnlyWordsWhichContainAllVowels

public static ImList<String> toOnlyWordsWhichContainAllVowels(ImList<String> words)

toOnlyEvens

public static ImList<Integer> toOnlyEvens(ImList<Integer> xs)

toOnlyWordsWhichContainAllVowels

public static ImList<String> toOnlyWordsWhichContainAllVowels(ImList<String> words)

firstPalindrome

public static Optional<String> firstPalindrome(ImList<String> words)

sum

public static int sum(ImList<Integer> xs)

countBetweenMinAndMaxExclusive

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

reverse

public static <E> ImList<E> reverse(ImList<E> xs)

toLengths

public static ImList<Integer> toLengths(ImList<String> texts)

toStrictlyLessThan

public static ImList<Boolean> toStrictlyLessThan(ImList<Integer> xs, int threshold)

Test

class: HigherOrderFunctionTestSuite.java Junit.png
package: hof
source folder: src/test/java