mirror of
https://github.com/ilyakooo0/Idris-dev.git
synced 2024-11-15 01:25:05 +03:00
17c7240825
+ Tutorial is now developed in a separate github repo. + Moved examples to top-level + Added binary of tutorial for v0.9.10
39 lines
1.0 KiB
Idris
39 lines
1.0 KiB
Idris
module idiom
|
|
|
|
data Expr = Var String
|
|
| Val Int
|
|
| Add Expr Expr
|
|
|
|
data Eval : Type -> Type where
|
|
MkEval : (List (String, Int) -> Maybe a) -> Eval a
|
|
|
|
fetch : String -> Eval Int
|
|
fetch x = MkEval (\e => fetchVal e) where
|
|
fetchVal : List (String, Int) -> Maybe Int
|
|
fetchVal [] = Nothing
|
|
fetchVal ((v, val) :: xs) = if (x == v) then (Just val) else (fetchVal xs)
|
|
|
|
instance Functor Eval where
|
|
map f (MkEval g) = MkEval (\e => map f (g e))
|
|
|
|
instance Applicative Eval where
|
|
pure x = MkEval (\e => Just x)
|
|
|
|
(<$>) (MkEval f) (MkEval g) = MkEval (\x => app (f x) (g x)) where
|
|
app : Maybe (a -> b) -> Maybe a -> Maybe b
|
|
app (Just fx) (Just gx) = Just (fx gx)
|
|
app _ _ = Nothing
|
|
|
|
eval : Expr -> Eval Int
|
|
eval (Var x) = fetch x
|
|
eval (Val x) = [| x |]
|
|
eval (Add x y) = [| eval x + eval y |]
|
|
|
|
runEval : List (String, Int) -> Expr -> Maybe Int
|
|
runEval env e = case eval e of
|
|
MkEval envFn => envFn env
|
|
|
|
m_add' : Maybe Int -> Maybe Int -> Maybe Int
|
|
m_add' x y = [| x + y |]
|
|
|