# Programming Language Design Assignment \#5
Please hand-in your answers on LMS before 12/20 23:55 and
make sure you're following these rules or you will get penalty:
* Submit your answers in a single pdf file. (only pdf files will be accepted)
* Name your pdf file by your student ID\#. (ex. `107525008.pdf`)
* Use `monospace`-style font to format all the program codes you wrote and **DO NOT** use code screenshots as your answer.
# Functional Programming
## Maybe
Given the function signatures below,
~~~haskell
readData :: String -> Maybe String
parseData :: String -> Maybe [(Int, Int)]
processData :: [(Int, Int)] -> Maybe [Int]
~~~
Rewrite the following code with monad(use `>>=` or do-notation.)
~~~haskell
process :: String -> Maybe [Int]
process filename =
case readData filename of
Nothing -> Nothing
Just rawLines ->
case parseData rawLines of
Nothing -> Nothing
Just parsed ->
case processData parsed of
Nothing -> Nothing
Just processed -> return processed
~~~
:::info
The `case expr of ...` is an expression to perform pattern matching. For example,
~~~haskell
f (Just a) = a + 1
f Nothing = 1
~~~
can be rewrite as
~~~haskell
f x = case x of
Just a -> a + 1
Nothing -> 1
~~~
:::
:::info
For the sake of simplicity, we don't make `readData` an `IO` action, but it should be one in a real scenario.
:::
## Left, Right or None
Suppose we're going to extends `Either` with a `None` case(like `Nothing` in `Maybe`):
~~~haskell
data MyEither a b = MyLeft a | MyRight b | None
deriving (Eq, Show)
~~~
Please show the instances of `Functor`, `Applicative` and `Monad` for `MyEither`.
Your implementation must obey functor/applicaitve/monad laws for corresponding instance.
# Aspect-Oriented Programming
## Logging
Suppose that the following code is the only aspect in a AspectJ program. Will it cause stack overflow? Why?
~~~~java
public aspect Logging {
pointcut logPrintln():
call(* *.println(..)) && !within(Logging);
after(): logPrintln() {
System.out.println("println is called!");
}
}
~~~~
## Memorization
The following is a Java program calculating binomial coefficients using a recursive algorithm.
Assume `n, k <= 32`, please implement a aspect to memorize/cache the binomial for speeding it up.
~~~java
class Bin {
int binomial(int n, int k) {
if (k == 0) return 1;
if (n == k) return 1;
return binomial(n - 1, k - 1) + binomial(n - 1, k);
}
public static void main(String[] args) {
Bin b = new Bin();
System.out.println(b.binomial(32, 16));
}
}
~~~~