
Hi, I’m looking at data Tree a = Node a [Tree a] deriving (Show) and trying to write the Applicative instance. I have I think a correct Functor : instance Functor (Tree) where fmap f (Node x tr) = Node (f x) ( fmap (fmap f) tr) but I’m well and truly stuck on Applicative :) I have instance Applicative (Tree) where pure x = Node x [] (Node f []) <*> tr = fmap f tr (Node f fs) <*> tr@(Node x xs) = ????? I cant get rid of the question marks! :) any pointers would be really appreciated! Thanks

data Tree a = Node a [Tree a]
well here is something that builds and runs. Not sure if the monad laws apply. watch out for indents! {-# LANGUAGE InstanceSigs #-} module TreeApp where import Debug.Trace import Data.Char data Tree a = Node a [Tree a] deriving (Show) instance Functor Tree where fmap::(a -> b) -> Tree a -> Tree b fmap f (Node x l0) = Node (f x) (fmap f <$> l0) instance Applicative Tree where pure::a -> Tree a pure a = Node a [] (<*>)::Tree (a -> b) -> Tree a -> Tree b (<*>) (Node f _) tra = f <$> tra instance Monad Tree where return::a -> Tree a return a = pure a (>>=)::Tree a -> (a -> Tree b) -> Tree b (>>=) (Node x []) amb = amb x (>>=) (Node x l0) amb = Node b (m1 <$> l0) where (Node b _) = amb x m1 ta = ta >>= amb f::Char->Int f = digitToInt mb::Char->Tree Int mb c = f <$> (pure c) main::Char -> Char -> IO () main a b = print $ tc4 >>= mb {- do print ti2 print ta3 tm4 <- tc4 -} where tc1 = pure a ti2 = f <$> tc1 ta3 = (Node f []) <*> tc1 tc4 = Node b [tc1]

#2 .. this is probably correct: {-# LANGUAGE InstanceSigs #-} module TreeApp where import Debug.Trace import Data.Char data Tree a = Node a [Tree a] deriving (Show) instance Functor Tree where fmap::(a -> b) -> Tree a -> Tree b fmap f (Node x l0) = Node (f x) (fmap f <$> l0) instance Applicative Tree where pure::a -> Tree a pure a = Node a [] (<*>)::Tree (a -> b) -> Tree a -> Tree b (<*>) (Node f []) tra = f <$> tra (<*>) tab@(Node f tf0) (Node x l0) = Node (f x) l1 where l1 = [fu <*> a | fu <- tf0 , a <- l0] instance Monad Tree where return::a -> Tree a return a = pure a (>>=)::Tree a -> (a -> Tree b) -> Tree b (>>=) (Node x []) amb = amb x (>>=) (Node x l0) amb = Node b (m1 <$> l0) where (Node b _) = amb x m1 ta = ta >>= amb f1::Char->Int f1 = digitToInt mb::Char->Tree Int mb c = f1 <$> (pure c) main::Char -> Char -> IO () main a b = print $ tc4 >>= mb where tc1 = Node a [Node b []] ti2 = f1 <$> tc1 ta3 = (Node f1 []) <*> tc1 tc4 = Node b [tc1]

Thanks I'll work through it.
On Tuesday, 8 September 2015, 0:39, Imants Cekusins
data Tree a = Node a [Tree a]
well here is something that builds and runs. Not sure if the monad laws apply. watch out for indents! {-# LANGUAGE InstanceSigs #-} module TreeApp where import Debug.Trace import Data.Char data Tree a = Node a [Tree a] deriving (Show) instance Functor Tree where fmap::(a -> b) -> Tree a -> Tree b fmap f (Node x l0) = Node (f x) (fmap f <$> l0) instance Applicative Tree where pure::a -> Tree a pure a = Node a [] (<*>)::Tree (a -> b) -> Tree a -> Tree b (<*>) (Node f _) tra = f <$> tra instance Monad Tree where return::a -> Tree a return a = pure a (>>=)::Tree a -> (a -> Tree b) -> Tree b (>>=) (Node x []) amb = amb x (>>=) (Node x l0) amb = Node b (m1 <$> l0) where (Node b _) = amb x m1 ta = ta >>= amb f::Char->Int f = digitToInt mb::Char->Tree Int mb c = f <$> (pure c) main::Char -> Char -> IO () main a b = print $ tc4 >>= mb {- do print ti2 print ta3 tm4 <- tc4 -} where tc1 = pure a ti2 = f <$> tc1 ta3 = (Node f []) <*> tc1 tc4 = Node b [tc1] _______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
participants (3)
-
Imants Cekusins
-
mike h
-
Mike Houghton