-
Notifications
You must be signed in to change notification settings - Fork 0
/
OddAsTraversable.hs
35 lines (29 loc) · 1.06 KB
/
OddAsTraversable.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import Control.Applicative
data OddC a = Un a | Bi a a (OddC a) deriving (Eq,Show)
instance Functor OddC where
fmap f (Un a) = Un $ f a
fmap f (Bi x y odd) = Bi (f x) (f y) (fmap f odd)
instance Foldable OddC where
-- foldr :: (a -> b -> b) -> b -> t a -> b
foldr f ini (Un a) = f a ini
foldr f ini (Bi x y odd) = f x (f y (foldr f ini odd))
instance Traversable OddC where
-- Applicative f => (a -> f b) -> OddC a -> f (OddC b)
traverse f (Un a) = pure Un <*> (f a)
traverse f (Bi x y odd) = pure Bi <*> (f x) <*> (f y) <*> (traverse f odd)
-- GHCi> cnt1 = Un 42
-- GHCi> cnt3 = Bi 1 2 cnt1
-- GHCi> cnt5 = Bi 3 4 cnt3
-- GHCi> cnt5
-- Bi 3 4 (Bi 1 2 (Un 42))
-- GHCi> cntInf = Bi 'A' 'B' cntInf
-- GHCi> cntInf
-- Bi 'A' 'B' (Bi 'A' 'B' (Bi 'A' 'B' (Bi 'A' 'B' (Bi 'A' 'B' (Bi 'A' 'B' (Bi 'A' 'B' (Bi 'A' 'B' (Bi 'A' 'B' (Bi 'A' 'B' (Bi 'A' 'Interrupted.
-- GHCi> (+1) <$> cnt5
-- Bi 4 5 (Bi 2 3 (Un 43))
-- GHCi> toList cnt5
-- [3,4,1,2,42]
-- GHCi> sum cnt5
-- 52
-- GHCi> traverse (\x->[x+2,x-2]) cnt1
-- [Un 44,Un 40]