/
FunC_script.hs
131 lines (74 loc) · 2.28 KB
/
FunC_script.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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeFamilies #-}
-- Script for live-coding FunC in a lecture
import Prelude hiding ((==), (<), not, min, zipWith, sum)
import qualified Prelude as P
import Control.Monad.State
import Data.Array
import Data.Tree hiding (drawTree)
import Data.Tree.View
----------------------------------------------------------------------
-- * Deep embedding
--
-- Designed to be easily translated to a low-level language such as C
----------------------------------------------------------------------
data FunC a
where
-- LitI
-- LitB
-- If
-- While
-- Prim1
-- Prim2
-- Value
-- Variable
-- Highlight use of GADT
-- eval :: FunC a -> a
-- evalFun :: (FunC a -> FunC b) -> a -> b
-- toTree, etc.
-- Boolean literals
-- instance Num (FunC Int)
-- Define (==), (<), not, min
----------------------------------------------------------------------
-- * Shallow embeddings
--
-- Designed with respect to the user
----------------------------------------------------------------------
-- class Syntactic a
-- instance Syntactic (FunC a)
-- desugar1, desugar2, desugar3
-- Define non-overloaded ifC
-- Define ifC, (?)
-- Define while
-- Syntactic instance for pairs
-- Define forLoop
----------------------------------------------------------------------
-- * Optional values
----------------------------------------------------------------------
-- Define Option
-- instance Syntactic a => Syntactic (Option a)
-- Inhabited class
-- Define some, none, option
-- option :: Syntactic b => b -> (a -> b) -> Option a -> b
-- instance Functor Option
-- instance Monad Option
-- divO :: FunC Int -> FunC Int -> Option (FunC Int)
-- divTest :: FunC Int -> FunC Int -> FunC Int -> Option (FunC Int)
----------------------------------------------------------------------
-- * Vectors
----------------------------------------------------------------------
-- Add arrays
-- len :: FunC (Array Int a) -> FunC Int
-- (<!>) :: FunC (Array Int a) -> FunC Int -> FunC a
-- data Vector a
-- vlen :: Vector a -> FunC Int
-- (<!!>) :: Vector a -> FunC Int -> a
-- Syntactic instance for vectors
-- instance Functor Vector
-- zipWith
-- sum
-- scalarProd
-- force
-- Demo fusion