This repository was archived by the owner on Apr 20, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path3_4_1_arr_2_3_trans.hs
More file actions
49 lines (40 loc) · 1.35 KB
/
3_4_1_arr_2_3_trans.hs
File metadata and controls
49 lines (40 loc) · 1.35 KB
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
36
37
38
39
40
41
42
43
44
45
46
47
48
{-
GHCi> (getArr2T $ arr2 (+)) 33 9 :: [Integer]
[42]
GHCi> (getArr3T $ arr3 foldr) (*) 1 [1..5] :: Either String Integer
Right 120
GHCi> import Data.Functor.Identity
GHCi> runIdentity $ (getArr2T $ arr2 (+)) 33 9
42
-}
import Data.Functor.Identity
newtype Arr2T e1 e2 m a = Arr2T { getArr2T :: e1 -> e2 -> m a }
newtype Arr3T e1 e2 e3 m a = Arr3T { getArr3T :: e1 -> e2 -> e3 -> m a }
{-
instance Functor (-> e) where
fmap :: (a -> b) -> (e -> a) -> (e -> b)
fmap f g = \x -> f (g x)
fmap f g = f . g
fmap = (.)
-}
arr2 :: Monad m => (e1 -> e2 -> a) -> Arr2T e1 e2 m a
-- arr2 f = Arr2T $ (return .) . f
arr2 = Arr2T . ((return <$>) <$>)
{-
fmap return :: f a -> f (m a) == (e -> a) -> (e -> m a)
fmap (fmap return) :: f1 (f2 a) -> f1 (f2 (m a) ==
(e1 -> (e2 -> a)) -> (e1 -> (e2 -> m a)) ==
(e1 -> e2 -> a) -> (e1 -> e2 -> m a) ==
(e1 -> e2 -> a) -> e1 -> e2 -> m a
-}
arr3 :: Monad m => (e1 -> e2 -> e3 -> a) -> Arr3T e1 e2 e3 m a
-- arr3 f = Arr3T $ ((return .) .) . f
arr3 = Arr3T . fmap (fmap (fmap return))
{-
fmap (fmap (fmap return)) :: f1 (f2 (f3 a)) -> f1 (f2 (f3 (m a))) ==
(e1 -> (e2 -> (e3 -> a))) -> (e1 -> (e2 -> (e3 -> m a)) ==
(e1 -> e2 -> e3 -> a) -> e1 -> e2 -> e3 -> m a
-}
ex1 = (getArr2T $ arr2 (+)) 33 9 :: [Integer]
ex2 = (getArr3T $ arr3 foldr) (*) 1 [1..5] :: Either String Integer
ex3 = runIdentity $ (getArr2T $ arr2 (+)) 33 9