summaryrefslogtreecommitdiff
path: root/lambda-calcul/haskell/src/Minilang/Lambda
diff options
context:
space:
mode:
Diffstat (limited to 'lambda-calcul/haskell/src/Minilang/Lambda')
-rw-r--r--lambda-calcul/haskell/src/Minilang/Lambda/Eval.hs9
-rw-r--r--lambda-calcul/haskell/src/Minilang/Lambda/Infer.hs10
-rw-r--r--lambda-calcul/haskell/src/Minilang/Lambda/Unify.hs5
3 files changed, 18 insertions, 6 deletions
diff --git a/lambda-calcul/haskell/src/Minilang/Lambda/Eval.hs b/lambda-calcul/haskell/src/Minilang/Lambda/Eval.hs
index 58f8ba6..7f7aad7 100644
--- a/lambda-calcul/haskell/src/Minilang/Lambda/Eval.hs
+++ b/lambda-calcul/haskell/src/Minilang/Lambda/Eval.hs
@@ -1,13 +1,16 @@
+{-# LANGUAGE DeriveAnyClass #-}
+
module Minilang.Lambda.Eval where
-import Data.Text (Text, unpack)
-import Debug.Trace (trace)
+import Data.Aeson (FromJSON, ToJSON)
+import Data.Text (Text)
+import GHC.Generics (Generic)
data Term
= Var Text
| Lam Text Term
| App Term Term
- deriving (Show, Read, Eq)
+ deriving (Show, Read, Eq, Generic, ToJSON, FromJSON)
type Env = [(Text, Term)]
diff --git a/lambda-calcul/haskell/src/Minilang/Lambda/Infer.hs b/lambda-calcul/haskell/src/Minilang/Lambda/Infer.hs
index 94fecb3..2e1814e 100644
--- a/lambda-calcul/haskell/src/Minilang/Lambda/Infer.hs
+++ b/lambda-calcul/haskell/src/Minilang/Lambda/Infer.hs
@@ -1,13 +1,16 @@
{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE DeriveAnyClass #-}
module Minilang.Lambda.Infer where
import Control.Monad.State (MonadState (..), StateT, evalStateT, modify)
+import Data.Aeson (FromJSON, ToJSON)
import Data.Bifunctor (first)
import Data.Char (chr, ord)
import qualified Data.List as List
import qualified Data.Map as Map
import Data.Text (Text, pack)
+import GHC.Generics (Generic)
import qualified Minilang.Lambda.Eval as Eval
import Minilang.Lambda.Unify (Type (..), UnifyError, apply, unify)
import Prelude hiding (lookup)
@@ -48,8 +51,11 @@ typeOf (Var _ t) = t
typeOf (Lam _ _ t) = t
typeOf (App _ _ t) = t
-data Context = Context {nextVar :: Int, typeContext :: Map.Map Text Type}
- deriving (Eq, Show)
+data Context = Context
+ { nextVar :: Int,
+ typeContext :: Map.Map Text Type
+ }
+ deriving (Eq, Show, Generic, ToJSON, FromJSON)
annotate :: Eval.Term -> Either TypeError (ATerm Type)
annotate t =
diff --git a/lambda-calcul/haskell/src/Minilang/Lambda/Unify.hs b/lambda-calcul/haskell/src/Minilang/Lambda/Unify.hs
index df66113..f3fff04 100644
--- a/lambda-calcul/haskell/src/Minilang/Lambda/Unify.hs
+++ b/lambda-calcul/haskell/src/Minilang/Lambda/Unify.hs
@@ -1,15 +1,18 @@
-- ported from https://www.cs.cornell.edu/courses/cs3110/2011sp/Lectures/lec26-type-inference/type-inference.htm
{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE DeriveAnyClass #-}
module Minilang.Lambda.Unify where
import Data.Text (Text)
+import GHC.Generics (Generic)
+import Data.Aeson (ToJSON, FromJSON)
type Identifier = Text
data Type
= TyVar Text
| Type :-> Type
- deriving (Show, Eq)
+ deriving (Show, Eq, Generic, ToJSON, FromJSON)
infixr 5 :->