typechecking things

This commit is contained in:
crumbtoo
2024-02-09 19:07:34 -07:00
parent 17d764c2ec
commit f53d42bf84
3 changed files with 13 additions and 15 deletions

View File

@@ -21,6 +21,7 @@ import Lens.Micro.Mtl
import Lens.Micro.Platform import Lens.Micro.Platform
import Data.Maybe (fromMaybe) import Data.Maybe (fromMaybe)
import Data.Text qualified as T import Data.Text qualified as T
import Data.Pretty (rpretty)
import Data.HashMap.Strict qualified as H import Data.HashMap.Strict qualified as H
import Data.Foldable (traverse_) import Data.Foldable (traverse_)
import Data.Functor import Data.Functor
@@ -59,26 +60,22 @@ instance IsRlpcError TypeError where
-- todo: use anti-parser instead of show -- todo: use anti-parser instead of show
TyErrCouldNotUnify t u -> Text TyErrCouldNotUnify t u -> Text
[ T.pack $ printf "Could not match type `%s` with `%s`." [ T.pack $ printf "Could not match type `%s` with `%s`."
(show t) (show u) (rpretty @String t) (rpretty @String u)
, "Expected: " <> tshow t , "Expected: " <> rpretty t
, "Got: " <> tshow u , "Got: " <> rpretty u
] ]
TyErrUntypedVariable n -> Text TyErrUntypedVariable n -> Text
[ "Untyped (likely undefined) variable `" <> n <> "`" [ "Untyped (likely undefined) variable `" <> n <> "`"
] ]
TyErrRecursiveType t x -> Text TyErrRecursiveType t x -> Text
[ T.pack $ printf "recursive type error lol" [ T.pack $ printf "Recursive type: `%s' occurs in `%s'"
(rpretty @String t) (rpretty @String x)
] ]
where tshow = T.pack . show
-- | Synonym for @Errorful [TypeError]@. This means an @HMError@ action may -- | Synonym for @Errorful [TypeError]@. This means an @HMError@ action may
-- throw any number of fatal or nonfatal errors. Run with @runErrorful@. -- throw any number of fatal or nonfatal errors. Run with @runErrorful@.
type HMError = Errorful TypeError type HMError = Errorful TypeError
-- TODO: better errors. Errorful-esque, with cummulative errors instead of
-- instantly dying.
-- | Assert that an expression unifies with a given type -- | Assert that an expression unifies with a given type
-- --
-- >>> let e = [coreProg|3|] -- >>> let e = [coreProg|3|]
@@ -281,9 +278,3 @@ demoContext =
, ("False", TyCon "Bool") , ("False", TyCon "Bool")
] ]
pprintType :: Type -> String
pprintType (s :-> t) = "(" <> pprintType s <> " -> " <> pprintType t <> ")"
pprintType TyFun = "(->)"
pprintType (TyVar x) = x ^. unpacked
pprintType (TyCon t) = t ^. unpacked

View File

@@ -40,6 +40,8 @@ coreExprT :: QuasiQuoter
coreExprT = mkqq $ lexCoreR >=> parseCoreExprR >=> checkCoreExprR g coreExprT = mkqq $ lexCoreR >=> parseCoreExprR >=> checkCoreExprR g
where where
g = [ ("+#", TyCon "Int#" :-> TyCon "Int#" :-> TyCon "Int#") g = [ ("+#", TyCon "Int#" :-> TyCon "Int#" :-> TyCon "Int#")
, ("id", TyCon "a" :-> TyCon "a")
, ("fix", (TyCon "a" :-> TyCon "a") :-> TyCon "a")
] ]
mkqq :: (Lift a) => (Text -> RLPCIO a) -> QuasiQuoter mkqq :: (Lift a) => (Text -> RLPCIO a) -> QuasiQuoter

View File

@@ -1,5 +1,6 @@
module Data.Pretty module Data.Pretty
( Pretty(..) ( Pretty(..)
, rpretty
, ttext , ttext
-- * Pretty-printing lens combinators -- * Pretty-printing lens combinators
, hsepOf, vsepOf , hsepOf, vsepOf
@@ -12,6 +13,7 @@ module Data.Pretty
---------------------------------------------------------------------------------- ----------------------------------------------------------------------------------
import Text.PrettyPrint hiding ((<>)) import Text.PrettyPrint hiding ((<>))
import Text.PrettyPrint.HughesPJ hiding ((<>)) import Text.PrettyPrint.HughesPJ hiding ((<>))
import Text.Printf
import Data.String (IsString(..)) import Data.String (IsString(..))
import Data.Text.Lens import Data.Text.Lens
import Data.Monoid import Data.Monoid
@@ -27,6 +29,9 @@ class Pretty a where
pretty = prettyPrec 0 pretty = prettyPrec 0
prettyPrec a _ = pretty a prettyPrec a _ = pretty a
rpretty :: (IsString s, Pretty a) => a -> s
rpretty = fromString . render . pretty
instance Pretty String where instance Pretty String where
pretty = Text.PrettyPrint.text pretty = Text.PrettyPrint.text