
Hi Mike,
An applicative instance of `Maybe` is enough to write the convert function you're looking for. Applicative is very useful when there are no dependencies between different branches, like when converting `Add`. But anyway, converting between applicative and monadic operations is a good exercise, which I'll leave for you. It's always possible to convert from applicative to monadic form, but the more useful conversion is from monadic to applicative (which is not always possible):
```
convert :: Expr (Maybe a) -> Maybe (Expr a)
convert (Var a) = Var <$> a
convert (Add a b) = Add <$> convert a
<*> convert b
```
Best regards,
Marcin
Sent with ProtonMail Secure Email.
‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
On Thursday, November 25th, 2021 at 18:10, mike h
Hi,
This isn’t homework! I’ve been staring at this for several hours - and that usually works.
I also tried typed holes to no avail. I thinks it is quite simple really but I’ve gone past seeing it!
I have
data Expr a = Var a | Add (Expr a) (Expr a)
and would like to write
convert :: Expr (Maybe a) -> Maybe (Expr a)
which returns Nothing if there is an occurrence of Nothing inside the
input expression e, otherwise it returns Just e', where e'
is a new expression where the internal values of type a are not wrapped in Just.
You should use the functionality of the Maybe monad to implement
the convert function.
Thanks
Mike
Beginners mailing list
Beginners@haskell.org