hakaru 0.4.0 → 0.6.0
raw patch · 76 files changed
+5442/−3710 lines, 76 filesdep +exact-combinatoricsdep +sybdep −ansi-terminaldep −hakarudep ~filepathdep ~transformers-compatnew-component:exe:prettyinternalPVP ok
version bump matches the API change (PVP)
Dependencies added: exact-combinatorics, syb
Dependencies removed: ansi-terminal, hakaru
Dependency ranges changed: filepath, transformers-compat
API changes (from Hackage documentation)
- Language.Hakaru.CodeGen.CodeGenMonad: isParallel :: CodeGen Bool
- Language.Hakaru.CodeGen.CodeGenMonad: mkParallel :: CodeGen ()
- Language.Hakaru.CodeGen.CodeGenMonad: mkSequential :: CodeGen ()
- Language.Hakaru.CodeGen.Types: closureDeclaration :: (Sing (a :: Hakaru)) -> Ident -> CDecl
- Language.Hakaru.Parser.AST: Dirac :: (AST' a) -> AST' a
- Language.Hakaru.Parser.AST: Empty :: AST' a
- Language.Hakaru.Parser.AST: [Empty_] :: Term abt U
- Language.Hakaru.Parser.AST: [Expect_] :: abt '[] U -> abt '[U] U -> Term abt U
- Language.Hakaru.Parser.AST: [Observe_] :: abt '[] U -> abt '[] U -> Term abt U
- Language.Hakaru.Parser.AST: numberLine :: Text -> Int -> Text
- Language.Hakaru.Parser.Import: replaceBody :: AST' Text -> AST' Text -> AST' Text
- Language.Hakaru.Parser.Parser: ann_expr :: Parser (AST' Text -> AST' Text)
- Language.Hakaru.Parser.Parser: app1 :: Text -> AST' Text -> AST' Text
- Language.Hakaru.Parser.Parser: app2 :: Text -> AST' Text -> AST' Text -> AST' Text
- Language.Hakaru.Parser.Parser: array_expr :: Parser (AST' Text)
- Language.Hakaru.Parser.Parser: array_index :: Parser (AST' Text -> AST' Text)
- Language.Hakaru.Parser.Parser: array_literal :: Parser (AST' Text)
- Language.Hakaru.Parser.Parser: binary :: String -> Assoc -> Operator (AST' Text)
- Language.Hakaru.Parser.Parser: bind_expr :: Parser (AST' Text)
- Language.Hakaru.Parser.Parser: binop :: Text -> AST' Text -> AST' Text -> AST' Text
- Language.Hakaru.Parser.Parser: blockOfMany :: Parser a -> Parser [a]
- Language.Hakaru.Parser.Parser: braces :: Parser a -> Parser a
- Language.Hakaru.Parser.Parser: brackets :: Parser a -> Parser a
- Language.Hakaru.Parser.Parser: branch_expr :: Parser (Branch' Text)
- Language.Hakaru.Parser.Parser: call_expr :: Parser (AST' Text)
- Language.Hakaru.Parser.Parser: chain_expr :: Parser (AST' Text)
- Language.Hakaru.Parser.Parser: commaSep :: Parser a -> Parser [a]
- Language.Hakaru.Parser.Parser: comments :: Parser ()
- Language.Hakaru.Parser.Parser: data_expr :: Parser (AST' Text)
- Language.Hakaru.Parser.Parser: decimal :: Parser Integer
- Language.Hakaru.Parser.Parser: def_expr :: Parser (AST' Text)
- Language.Hakaru.Parser.Parser: defarg :: Parser (Text, TypeAST')
- Language.Hakaru.Parser.Parser: divide :: AST' Text -> AST' Text -> AST' Text
- Language.Hakaru.Parser.Parser: emptyLine :: Parser ()
- Language.Hakaru.Parser.Parser: empty_ :: Parser (AST' a)
- Language.Hakaru.Parser.Parser: expect_expr :: Parser (AST' Text)
- Language.Hakaru.Parser.Parser: exponent' :: Parser Rational
- Language.Hakaru.Parser.Parser: expr :: Parser (AST' Text)
- Language.Hakaru.Parser.Parser: exprWithImport :: Parser (ASTWithImport' Text)
- Language.Hakaru.Parser.Parser: float :: Parser Rational
- Language.Hakaru.Parser.Parser: floating :: Parser (AST' a)
- Language.Hakaru.Parser.Parser: fractExponent :: Integer -> Parser Rational
- Language.Hakaru.Parser.Parser: fractFloat :: Integer -> Parser (Either Integer Rational)
- Language.Hakaru.Parser.Parser: fraction :: Parser Rational
- Language.Hakaru.Parser.Parser: identifier :: Parser Text
- Language.Hakaru.Parser.Parser: if_expr :: Parser (AST' Text)
- Language.Hakaru.Parser.Parser: import_expr :: Parser (Import Text)
- Language.Hakaru.Parser.Parser: indentConfig :: Text -> ParserStream
- Language.Hakaru.Parser.Parser: inf_ :: Parser (AST' Text)
- Language.Hakaru.Parser.Parser: int :: Parser (AST' a)
- Language.Hakaru.Parser.Parser: integer :: Parser Integer
- Language.Hakaru.Parser.Parser: integrate_expr :: Parser (AST' Text)
- Language.Hakaru.Parser.Parser: lam_expr :: Parser (AST' Text)
- Language.Hakaru.Parser.Parser: let_expr :: Parser (AST' Text)
- Language.Hakaru.Parser.Parser: lexer :: GenTokenParser ParserStream () Identity
- Language.Hakaru.Parser.Parser: match_expr :: Parser (AST' Text)
- Language.Hakaru.Parser.Parser: names :: [String]
- Language.Hakaru.Parser.Parser: observe_expr :: Parser (AST' Text)
- Language.Hakaru.Parser.Parser: ops :: [String]
- Language.Hakaru.Parser.Parser: pairs :: Parser (AST' Text)
- Language.Hakaru.Parser.Parser: parens :: Parser a -> Parser a
- Language.Hakaru.Parser.Parser: parseAtTopLevel :: Parser a -> Text -> Either ParseError a
- Language.Hakaru.Parser.Parser: pat_expr :: Parser (Pattern' Text)
- Language.Hakaru.Parser.Parser: pdat_expr :: Parser (PDatum Text)
- Language.Hakaru.Parser.Parser: plate_expr :: Parser (AST' Text)
- Language.Hakaru.Parser.Parser: postfix :: Parser (a -> a) -> Operator a
- Language.Hakaru.Parser.Parser: prefix :: String -> (a -> a) -> Operator a
- Language.Hakaru.Parser.Parser: product_expr :: Parser (AST' Text)
- Language.Hakaru.Parser.Parser: pseudoblockExpr :: Parser (AST' Text)
- Language.Hakaru.Parser.Parser: reserved :: String -> Parser ()
- Language.Hakaru.Parser.Parser: reservedOp :: String -> Parser ()
- Language.Hakaru.Parser.Parser: return_expr :: Parser (AST' Text)
- Language.Hakaru.Parser.Parser: semiSep :: Parser a -> Parser [a]
- Language.Hakaru.Parser.Parser: semiSep1 :: Parser a -> Parser [a]
- Language.Hakaru.Parser.Parser: semiblockExpr :: Parser (AST' Text)
- Language.Hakaru.Parser.Parser: style :: GenLanguageDef ParserStream st Identity
- Language.Hakaru.Parser.Parser: summate_expr :: Parser (AST' Text)
- Language.Hakaru.Parser.Parser: symbol :: Text -> Parser Text
- Language.Hakaru.Parser.Parser: table :: OperatorTable (AST' Text)
- Language.Hakaru.Parser.Parser: term :: Parser (AST' Text)
- Language.Hakaru.Parser.Parser: type Operator a = Operator ParserStream () Identity a
- Language.Hakaru.Parser.Parser: type OperatorTable a = [[Operator a]]
- Language.Hakaru.Parser.Parser: type Parser = ParsecT ParserStream () Identity
- Language.Hakaru.Parser.Parser: type ParserStream = IndentStream (CharIndentStream Text)
- Language.Hakaru.Parser.Parser: type_app :: Parser TypeAST'
- Language.Hakaru.Parser.Parser: type_expr :: Parser TypeAST'
- Language.Hakaru.Parser.Parser: type_fun :: Parser TypeAST'
- Language.Hakaru.Parser.Parser: type_var :: Parser TypeAST'
- Language.Hakaru.Parser.Parser: types :: [String]
- Language.Hakaru.Parser.Parser: unit_ :: Parser (AST' a)
- Language.Hakaru.Parser.Parser: var :: Parser (AST' Text)
- Language.Hakaru.Parser.Parser: whiteSpace :: Parser ()
- Language.Hakaru.Parser.Parser: withPos :: Parser (AST' a) -> Parser (AST' a)
- Language.Hakaru.Parser.SymbolResolve: TLam :: (a -> Symbol a) -> Symbol a
- Language.Hakaru.Parser.SymbolResolve: TLam' :: ([a] -> a) -> Symbol' a
- Language.Hakaru.Parser.SymbolResolve: TNeu :: a -> Symbol a
- Language.Hakaru.Parser.SymbolResolve: TNeu' :: a -> Symbol' a
- Language.Hakaru.Parser.SymbolResolve: branchNorm :: Branch' (Symbol AST) -> Branch' (Symbol AST)
- Language.Hakaru.Parser.SymbolResolve: cInt2Real :: Coercion HInt HReal
- Language.Hakaru.Parser.SymbolResolve: cNat2Int :: Coercion HNat HInt
- Language.Hakaru.Parser.SymbolResolve: cNat2Prob :: Coercion HNat HProb
- Language.Hakaru.Parser.SymbolResolve: cNat2Real :: Coercion HNat HReal
- Language.Hakaru.Parser.SymbolResolve: cProb2Real :: Coercion HProb HReal
- Language.Hakaru.Parser.SymbolResolve: collapseSuperposes :: [AST] -> AST
- Language.Hakaru.Parser.SymbolResolve: data Symbol a
- Language.Hakaru.Parser.SymbolResolve: data Symbol' a
- Language.Hakaru.Parser.SymbolResolve: false_ :: AST
- Language.Hakaru.Parser.SymbolResolve: gensym :: Text -> State Int Name
- Language.Hakaru.Parser.SymbolResolve: insertSymbol :: Name -> SymbolTable -> SymbolTable
- Language.Hakaru.Parser.SymbolResolve: insertSymbols :: [Name] -> SymbolTable -> SymbolTable
- Language.Hakaru.Parser.SymbolResolve: makeAST :: AST' (Symbol AST) -> AST
- Language.Hakaru.Parser.SymbolResolve: makeBranch :: Branch' (Symbol AST) -> Branch
- Language.Hakaru.Parser.SymbolResolve: makeFalse :: AST' (Symbol AST) -> Branch
- Language.Hakaru.Parser.SymbolResolve: makePattern :: Pattern' Name -> Pattern
- Language.Hakaru.Parser.SymbolResolve: makeReducerAST :: Variable U -> Reducer' (Symbol AST) -> List1 Variable xs -> Reducer xs U_ABT U
- Language.Hakaru.Parser.SymbolResolve: makeTrue :: AST' (Symbol AST) -> Branch
- Language.Hakaru.Parser.SymbolResolve: makeType :: TypeAST' -> SSing
- Language.Hakaru.Parser.SymbolResolve: mkSym :: Name -> Symbol AST
- Language.Hakaru.Parser.SymbolResolve: normAST :: AST' (Symbol AST) -> AST' (Symbol AST)
- Language.Hakaru.Parser.SymbolResolve: pairPat :: Pattern -> Pattern -> Pattern
- Language.Hakaru.Parser.SymbolResolve: primCoerce :: Coercion a b -> Symbol AST
- Language.Hakaru.Parser.SymbolResolve: primFactor :: Symbol AST
- Language.Hakaru.Parser.SymbolResolve: primJust :: Symbol AST
- Language.Hakaru.Parser.SymbolResolve: primLeft :: Symbol AST
- Language.Hakaru.Parser.SymbolResolve: primMeasure1 :: SomeOp MeasureOp -> Symbol AST
- Language.Hakaru.Parser.SymbolResolve: primMeasure2 :: SomeOp MeasureOp -> Symbol AST
- Language.Hakaru.Parser.SymbolResolve: primNothing :: Symbol AST
- Language.Hakaru.Parser.SymbolResolve: primPat :: [(Text, Symbol' Pattern)]
- Language.Hakaru.Parser.SymbolResolve: primPrimOp0 :: PrimOp -> Symbol AST
- Language.Hakaru.Parser.SymbolResolve: primPrimOp1 :: PrimOp -> Symbol AST
- Language.Hakaru.Parser.SymbolResolve: primPrimOp2 :: PrimOp -> Symbol AST
- Language.Hakaru.Parser.SymbolResolve: primRight :: Symbol AST
- Language.Hakaru.Parser.SymbolResolve: primTable :: SymbolTable
- Language.Hakaru.Parser.SymbolResolve: primTypes :: [(Text, Symbol' SSing)]
- Language.Hakaru.Parser.SymbolResolve: primUnsafe :: Coercion a b -> Symbol AST
- Language.Hakaru.Parser.SymbolResolve: primWeight :: Symbol AST
- Language.Hakaru.Parser.SymbolResolve: redNorm :: Reducer' (Symbol AST) -> Reducer' (Symbol AST)
- Language.Hakaru.Parser.SymbolResolve: resolveBinder :: SymbolTable -> Text -> AST' Text -> AST' Text -> (Symbol AST -> AST' (Symbol AST) -> AST' (Symbol AST) -> AST' (Symbol AST)) -> State Int (AST' (Symbol AST))
- Language.Hakaru.Parser.SymbolResolve: singleton :: a -> NonEmpty a
- Language.Hakaru.Parser.SymbolResolve: symbolResolution :: SymbolTable -> AST' Text -> State Int (AST' (Symbol AST))
- Language.Hakaru.Parser.SymbolResolve: symbolResolutionReducer :: SymbolTable -> Reducer' Text -> State Int (Reducer' (Symbol AST))
- Language.Hakaru.Parser.SymbolResolve: symbolResolveBranch :: SymbolTable -> Branch' Text -> State Int (Branch' (Symbol AST))
- Language.Hakaru.Parser.SymbolResolve: symbolResolvePat :: Pattern' Text -> State Int (Pattern' Name, [Name])
- Language.Hakaru.Parser.SymbolResolve: t2 :: (AST -> AST -> AST) -> Symbol AST
- Language.Hakaru.Parser.SymbolResolve: t3 :: (AST -> AST -> AST -> AST) -> Symbol AST
- Language.Hakaru.Parser.SymbolResolve: true_ :: AST
- Language.Hakaru.Parser.SymbolResolve: two :: AST
- Language.Hakaru.Parser.SymbolResolve: type SymbolTable = [(Text, Symbol AST)]
- Language.Hakaru.Parser.SymbolResolve: unit_ :: AST
- Language.Hakaru.Parser.SymbolResolve: unsafeFrom_ :: AST -> AST
- Language.Hakaru.Parser.SymbolResolve: withName :: String -> Symbol AST -> (Variable U -> r) -> r
- Language.Hakaru.Pretty.Concrete: prettyAssoc :: (ABT Term abt) => Assoc (abt '[]) -> Doc
- Language.Hakaru.Pretty.Concrete: prettyPrecAssoc :: (ABT Term abt) => Int -> Assoc (abt '[]) -> Doc
- Language.Hakaru.Runtime.CmdLine: instance (GHC.Show.Show (v a), Data.Vector.Generic.Base.Vector (Language.Hakaru.Runtime.Prelude.MayBoxVec a) a, v ~ Language.Hakaru.Runtime.Prelude.MayBoxVec a) => Language.Hakaru.Runtime.CmdLine.MakeMain (v a)
- Language.Hakaru.Runtime.CmdLine: instance GHC.Show.Show a => Language.Hakaru.Runtime.CmdLine.MakeMain (Language.Hakaru.Runtime.Prelude.Measure a)
- Language.Hakaru.Runtime.CmdLine: instance Language.Hakaru.Runtime.CmdLine.MakeMain GHC.Types.Double
- Language.Hakaru.Runtime.CmdLine: instance Language.Hakaru.Runtime.CmdLine.MakeMain GHC.Types.Int
- Language.Hakaru.Runtime.LogFloatCmdLine: class MakeMain p
- Language.Hakaru.Runtime.LogFloatCmdLine: class Parseable a
- Language.Hakaru.Runtime.LogFloatCmdLine: instance (Data.Vector.Unboxed.Base.Unbox a, Language.Hakaru.Runtime.LogFloatCmdLine.Parseable a) => Language.Hakaru.Runtime.LogFloatCmdLine.Parseable (Data.Vector.Unboxed.Base.Vector a)
- Language.Hakaru.Runtime.LogFloatCmdLine: instance (GHC.Read.Read a, GHC.Read.Read b, Language.Hakaru.Runtime.LogFloatCmdLine.Parseable a, Language.Hakaru.Runtime.LogFloatCmdLine.Parseable b) => Language.Hakaru.Runtime.LogFloatCmdLine.Parseable (a, b)
- Language.Hakaru.Runtime.LogFloatCmdLine: instance (GHC.Show.Show (v a), Data.Vector.Generic.Base.Vector (Language.Hakaru.Runtime.LogFloatPrelude.MayBoxVec a) a, v ~ Language.Hakaru.Runtime.LogFloatPrelude.MayBoxVec a) => Language.Hakaru.Runtime.LogFloatCmdLine.MakeMain (v a)
- Language.Hakaru.Runtime.LogFloatCmdLine: instance (Language.Hakaru.Runtime.LogFloatCmdLine.Parseable a, Language.Hakaru.Runtime.LogFloatCmdLine.MakeMain b) => Language.Hakaru.Runtime.LogFloatCmdLine.MakeMain (a -> b)
- Language.Hakaru.Runtime.LogFloatCmdLine: instance GHC.Read.Read Data.Number.LogFloat.LogFloat
- Language.Hakaru.Runtime.LogFloatCmdLine: instance GHC.Show.Show a => Language.Hakaru.Runtime.LogFloatCmdLine.MakeMain (Language.Hakaru.Runtime.LogFloatPrelude.Measure a)
- Language.Hakaru.Runtime.LogFloatCmdLine: instance Language.Hakaru.Runtime.LogFloatCmdLine.MakeMain Data.Number.LogFloat.LogFloat
- Language.Hakaru.Runtime.LogFloatCmdLine: instance Language.Hakaru.Runtime.LogFloatCmdLine.MakeMain GHC.Types.Double
- Language.Hakaru.Runtime.LogFloatCmdLine: instance Language.Hakaru.Runtime.LogFloatCmdLine.MakeMain GHC.Types.Int
- Language.Hakaru.Runtime.LogFloatCmdLine: instance Language.Hakaru.Runtime.LogFloatCmdLine.Parseable Data.Number.LogFloat.LogFloat
- Language.Hakaru.Runtime.LogFloatCmdLine: instance Language.Hakaru.Runtime.LogFloatCmdLine.Parseable GHC.Types.Double
- Language.Hakaru.Runtime.LogFloatCmdLine: instance Language.Hakaru.Runtime.LogFloatCmdLine.Parseable GHC.Types.Int
- Language.Hakaru.Runtime.LogFloatCmdLine: makeMain :: MakeMain p => p -> [String] -> IO ()
- Language.Hakaru.Runtime.LogFloatCmdLine: parse :: Parseable a => String -> IO a
- Language.Hakaru.Runtime.LogFloatPrelude: Measure :: (GenIO -> IO (Maybe a)) -> Measure a
- Language.Hakaru.Runtime.LogFloatPrelude: [unMeasure] :: Measure a -> GenIO -> IO (Maybe a)
- Language.Hakaru.Runtime.LogFloatPrelude: instance GHC.Base.Applicative Language.Hakaru.Runtime.LogFloatPrelude.Measure
- Language.Hakaru.Runtime.LogFloatPrelude: instance GHC.Base.Functor Language.Hakaru.Runtime.LogFloatPrelude.Measure
- Language.Hakaru.Runtime.LogFloatPrelude: instance GHC.Base.Monad Language.Hakaru.Runtime.LogFloatPrelude.Measure
- Language.Hakaru.Runtime.LogFloatPrelude: makeMeasure :: (GenIO -> IO a) -> Measure a
- Language.Hakaru.Runtime.LogFloatPrelude: newtype Measure a
- Language.Hakaru.Runtime.Prelude: Measure :: (GenIO -> IO (Maybe a)) -> Measure a
- Language.Hakaru.Runtime.Prelude: [unMeasure] :: Measure a -> GenIO -> IO (Maybe a)
- Language.Hakaru.Runtime.Prelude: instance GHC.Base.Applicative Language.Hakaru.Runtime.Prelude.Measure
- Language.Hakaru.Runtime.Prelude: instance GHC.Base.Functor Language.Hakaru.Runtime.Prelude.Measure
- Language.Hakaru.Runtime.Prelude: instance GHC.Base.Monad Language.Hakaru.Runtime.Prelude.Measure
- Language.Hakaru.Runtime.Prelude: makeMeasure :: (GenIO -> IO a) -> Measure a
- Language.Hakaru.Runtime.Prelude: newtype Measure a
- Language.Hakaru.Syntax.ABT: instance forall a (syn :: ([a] -> a -> GHC.Types.*) -> a -> GHC.Types.*) (abt :: [a] -> a -> GHC.Types.*) (xs :: [a]) as (x :: a). (Language.Hakaru.Syntax.ABT.Binders syn abt xs as, Language.Hakaru.Types.Sing.SingI x) => Language.Hakaru.Syntax.ABT.Binders syn abt (x : xs) (abt '[] x, as)
- Language.Hakaru.Syntax.ABT: instance forall k (rec :: k -> GHC.Types.*) (xs :: [k]) (a :: k). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 rec) => GHC.Show.Show (Language.Hakaru.Syntax.ABT.View rec xs a)
- Language.Hakaru.Syntax.ABT: instance forall k (rec :: k -> GHC.Types.*) (xs :: [k]). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 rec) => Language.Hakaru.Syntax.IClasses.Show1 (Language.Hakaru.Syntax.ABT.View rec xs)
- Language.Hakaru.Syntax.ABT: instance forall k (rec :: k -> GHC.Types.*). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 rec) => Language.Hakaru.Syntax.IClasses.Show2 (Language.Hakaru.Syntax.ABT.View rec)
- Language.Hakaru.Syntax.ABT: instance forall k (syn :: ([k] -> k -> GHC.Types.*) -> k -> GHC.Types.*) (abt :: [k] -> k -> GHC.Types.*). Language.Hakaru.Syntax.ABT.ABT syn abt => Language.Hakaru.Syntax.ABT.Binders syn abt '[] ()
- Language.Hakaru.Syntax.ABT: instance forall k (syn :: ([k] -> k -> GHC.Types.*) -> k -> GHC.Types.*) (xs :: [k]) (a :: k). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 (syn (Language.Hakaru.Syntax.ABT.MemoizedABT syn))) => GHC.Show.Show (Language.Hakaru.Syntax.ABT.MemoizedABT syn xs a)
- Language.Hakaru.Syntax.ABT: instance forall k (syn :: ([k] -> k -> GHC.Types.*) -> k -> GHC.Types.*) (xs :: [k]) (a :: k). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 (syn (Language.Hakaru.Syntax.ABT.TrivialABT syn))) => GHC.Show.Show (Language.Hakaru.Syntax.ABT.TrivialABT syn xs a)
- Language.Hakaru.Syntax.ABT: instance forall k (syn :: ([k] -> k -> GHC.Types.*) -> k -> GHC.Types.*) (xs :: [k]). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 (syn (Language.Hakaru.Syntax.ABT.MemoizedABT syn))) => Language.Hakaru.Syntax.IClasses.Show1 (Language.Hakaru.Syntax.ABT.MemoizedABT syn xs)
- Language.Hakaru.Syntax.ABT: instance forall k (syn :: ([k] -> k -> GHC.Types.*) -> k -> GHC.Types.*) (xs :: [k]). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 (syn (Language.Hakaru.Syntax.ABT.TrivialABT syn))) => Language.Hakaru.Syntax.IClasses.Show1 (Language.Hakaru.Syntax.ABT.TrivialABT syn xs)
- Language.Hakaru.Syntax.ABT: instance forall k (syn :: ([k] -> k -> GHC.Types.*) -> k -> GHC.Types.*) meta (xs :: [k]) (a :: k). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 (syn (Language.Hakaru.Syntax.ABT.MetaABT meta syn)), GHC.Show.Show meta) => GHC.Show.Show (Language.Hakaru.Syntax.ABT.MetaABT meta syn xs a)
- Language.Hakaru.Syntax.ABT: instance forall k (syn :: ([k] -> k -> GHC.Types.*) -> k -> GHC.Types.*) meta (xs :: [k]). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 (syn (Language.Hakaru.Syntax.ABT.MetaABT meta syn)), GHC.Show.Show meta) => Language.Hakaru.Syntax.IClasses.Show1 (Language.Hakaru.Syntax.ABT.MetaABT meta syn xs)
- Language.Hakaru.Syntax.ABT: instance forall k (syn :: ([k] -> k -> GHC.Types.*) -> k -> GHC.Types.*) meta. (Language.Hakaru.Syntax.IClasses.JmEq1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Foldable21 syn) => Language.Hakaru.Syntax.ABT.ABT syn (Language.Hakaru.Syntax.ABT.MetaABT meta syn)
- Language.Hakaru.Syntax.ABT: instance forall k (syn :: ([k] -> k -> GHC.Types.*) -> k -> GHC.Types.*) meta. (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 (syn (Language.Hakaru.Syntax.ABT.MetaABT meta syn)), GHC.Show.Show meta) => Language.Hakaru.Syntax.IClasses.Show2 (Language.Hakaru.Syntax.ABT.MetaABT meta syn)
- Language.Hakaru.Syntax.ABT: instance forall k (syn :: ([k] -> k -> GHC.Types.*) -> k -> GHC.Types.*). (Language.Hakaru.Syntax.IClasses.JmEq1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Foldable21 syn) => Language.Hakaru.Syntax.ABT.ABT syn (Language.Hakaru.Syntax.ABT.MemoizedABT syn)
- Language.Hakaru.Syntax.ABT: instance forall k (syn :: ([k] -> k -> GHC.Types.*) -> k -> GHC.Types.*). (Language.Hakaru.Syntax.IClasses.JmEq1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Foldable21 syn) => Language.Hakaru.Syntax.ABT.ABT syn (Language.Hakaru.Syntax.ABT.TrivialABT syn)
- Language.Hakaru.Syntax.ABT: instance forall k (syn :: ([k] -> k -> GHC.Types.*) -> k -> GHC.Types.*). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 (syn (Language.Hakaru.Syntax.ABT.MemoizedABT syn))) => Language.Hakaru.Syntax.IClasses.Show2 (Language.Hakaru.Syntax.ABT.MemoizedABT syn)
- Language.Hakaru.Syntax.ABT: instance forall k (syn :: ([k] -> k -> GHC.Types.*) -> k -> GHC.Types.*). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 (syn (Language.Hakaru.Syntax.ABT.TrivialABT syn))) => Language.Hakaru.Syntax.IClasses.Show2 (Language.Hakaru.Syntax.ABT.TrivialABT syn)
- Language.Hakaru.Syntax.AST: instance Language.Hakaru.Syntax.IClasses.Eq2 abt => GHC.Classes.Eq (Language.Hakaru.Syntax.AST.SArgs abt args)
- Language.Hakaru.Syntax.AST: instance Language.Hakaru.Syntax.IClasses.Eq2 abt => Language.Hakaru.Syntax.IClasses.Eq1 (Language.Hakaru.Syntax.AST.SArgs abt)
- Language.Hakaru.Syntax.AST: instance Language.Hakaru.Syntax.IClasses.Foldable21 Language.Hakaru.Syntax.AST.SArgs
- Language.Hakaru.Syntax.AST: instance Language.Hakaru.Syntax.IClasses.Functor21 Language.Hakaru.Syntax.AST.SArgs
- Language.Hakaru.Syntax.AST: instance Language.Hakaru.Syntax.IClasses.Show2 abt => GHC.Show.Show (Language.Hakaru.Syntax.AST.SArgs abt args)
- Language.Hakaru.Syntax.AST: instance Language.Hakaru.Syntax.IClasses.Show2 abt => Language.Hakaru.Syntax.IClasses.Show1 (Language.Hakaru.Syntax.AST.SArgs abt)
- Language.Hakaru.Syntax.AST: instance Language.Hakaru.Syntax.IClasses.Traversable21 Language.Hakaru.Syntax.AST.SArgs
- Language.Hakaru.Syntax.AST: type LC (a :: Hakaru) = '('[], a)
- Language.Hakaru.Syntax.AST.Eq: instance Language.Hakaru.Syntax.IClasses.JmEq2 abt => Language.Hakaru.Syntax.IClasses.JmEq1 (Language.Hakaru.Syntax.AST.SArgs abt)
- Language.Hakaru.Syntax.AST.Eq: instance forall k (syn :: ([k] -> k -> GHC.Types.*) -> k -> GHC.Types.*) (xs :: [k]) (a :: k). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.JmEq1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Foldable21 syn, Language.Hakaru.Syntax.IClasses.JmEq1 (syn (Language.Hakaru.Syntax.ABT.TrivialABT syn))) => GHC.Classes.Eq (Language.Hakaru.Syntax.ABT.TrivialABT syn xs a)
- Language.Hakaru.Syntax.AST.Eq: instance forall k (syn :: ([k] -> k -> GHC.Types.*) -> k -> GHC.Types.*) (xs :: [k]). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.JmEq1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Foldable21 syn, Language.Hakaru.Syntax.IClasses.JmEq1 (syn (Language.Hakaru.Syntax.ABT.TrivialABT syn))) => Language.Hakaru.Syntax.IClasses.Eq1 (Language.Hakaru.Syntax.ABT.TrivialABT syn xs)
- Language.Hakaru.Syntax.AST.Eq: instance forall k (syn :: ([k] -> k -> GHC.Types.*) -> k -> GHC.Types.*) (xs :: [k]). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.JmEq1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.JmEq1 (syn (Language.Hakaru.Syntax.ABT.TrivialABT syn)), Language.Hakaru.Syntax.IClasses.Foldable21 syn) => Language.Hakaru.Syntax.IClasses.JmEq1 (Language.Hakaru.Syntax.ABT.TrivialABT syn xs)
- Language.Hakaru.Syntax.AST.Eq: instance forall k (syn :: ([k] -> k -> GHC.Types.*) -> k -> GHC.Types.*). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.JmEq1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Foldable21 syn, Language.Hakaru.Syntax.IClasses.JmEq1 (syn (Language.Hakaru.Syntax.ABT.TrivialABT syn))) => Language.Hakaru.Syntax.IClasses.Eq2 (Language.Hakaru.Syntax.ABT.TrivialABT syn)
- Language.Hakaru.Syntax.AST.Eq: instance forall k (syn :: ([k] -> k -> GHC.Types.*) -> k -> GHC.Types.*). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.JmEq1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.JmEq1 (syn (Language.Hakaru.Syntax.ABT.TrivialABT syn)), Language.Hakaru.Syntax.IClasses.Foldable21 syn) => Language.Hakaru.Syntax.IClasses.JmEq2 (Language.Hakaru.Syntax.ABT.TrivialABT syn)
- Language.Hakaru.Syntax.Command: [DisintFun] :: !(CommandType "Disintegrate" x x') -> CommandType "Disintegrate" (a :-> x) (a :-> x')
- Language.Hakaru.Syntax.Command: [DisintMeas] :: CommandType "Disintegrate" (HMeasure (HPair a b)) (a :-> HMeasure b)
- Language.Hakaru.Syntax.Command: [Simplify] :: CommandType "Simplify" a a
- Language.Hakaru.Syntax.Command: [Summarize] :: CommandType "Summarize" a a
- Language.Hakaru.Syntax.Command: commandFromName :: String -> Sing i -> (forall o c. Either Bool (CommandType c i o, Sing o) -> k) -> k
- Language.Hakaru.Syntax.Command: commandIsType :: CommandType c i o -> Sing i -> Sing o
- Language.Hakaru.Syntax.Command: data CommandType (c :: Symbol) (i :: Hakaru) (o :: Hakaru)
- Language.Hakaru.Syntax.Command: nameOfCommand :: CommandType c i o -> Sing c
- Language.Hakaru.Syntax.Command: parseCommand :: [Char] -> [Char] -> Bool
- Language.Hakaru.Syntax.IClasses: instance forall k (a :: k -> GHC.Types.*) (b :: k -> GHC.Types.*) (i :: k). (Language.Hakaru.Syntax.IClasses.Show1 a, Language.Hakaru.Syntax.IClasses.Show1 b) => GHC.Show.Show (Language.Hakaru.Syntax.IClasses.Pair1 a b i)
- Language.Hakaru.Syntax.IClasses: instance forall k (a :: k -> GHC.Types.*) (b :: k -> GHC.Types.*). (Language.Hakaru.Syntax.IClasses.Show1 a, Language.Hakaru.Syntax.IClasses.Show1 b) => Language.Hakaru.Syntax.IClasses.Show1 (Language.Hakaru.Syntax.IClasses.Pair1 a b)
- Language.Hakaru.Syntax.IClasses: instance forall k (a :: k -> GHC.Types.*) (xs :: [k]). Language.Hakaru.Syntax.IClasses.Eq1 a => GHC.Classes.Eq (Language.Hakaru.Syntax.IClasses.List1 a xs)
- Language.Hakaru.Syntax.IClasses: instance forall k (a :: k -> GHC.Types.*) (xs :: [k]). Language.Hakaru.Syntax.IClasses.Show1 a => GHC.Show.Show (Language.Hakaru.Syntax.IClasses.List1 a xs)
- Language.Hakaru.Syntax.IClasses: instance forall k (a :: k -> GHC.Types.*). Language.Hakaru.Syntax.IClasses.Eq1 a => Language.Hakaru.Syntax.IClasses.Eq1 (Language.Hakaru.Syntax.IClasses.List1 a)
- Language.Hakaru.Syntax.IClasses: instance forall k (a :: k -> GHC.Types.*). Language.Hakaru.Syntax.IClasses.JmEq1 a => GHC.Classes.Eq (Language.Hakaru.Syntax.IClasses.Some1 a)
- Language.Hakaru.Syntax.IClasses: instance forall k (a :: k -> GHC.Types.*). Language.Hakaru.Syntax.IClasses.JmEq1 a => Language.Hakaru.Syntax.IClasses.JmEq1 (Language.Hakaru.Syntax.IClasses.List1 a)
- Language.Hakaru.Syntax.IClasses: instance forall k (a :: k -> GHC.Types.*). Language.Hakaru.Syntax.IClasses.Show1 a => GHC.Show.Show (Language.Hakaru.Syntax.IClasses.Some1 a)
- Language.Hakaru.Syntax.IClasses: instance forall k (a :: k -> GHC.Types.*). Language.Hakaru.Syntax.IClasses.Show1 a => Language.Hakaru.Syntax.IClasses.Show1 (Language.Hakaru.Syntax.IClasses.List1 a)
- Language.Hakaru.Syntax.IClasses: instance forall k k1 (a :: k1 -> k -> GHC.Types.*) (b :: k1 -> k -> GHC.Types.*) (i :: k1). (Language.Hakaru.Syntax.IClasses.Show2 a, Language.Hakaru.Syntax.IClasses.Show2 b) => Language.Hakaru.Syntax.IClasses.Show1 (Language.Hakaru.Syntax.IClasses.Pair2 a b i)
- Language.Hakaru.Syntax.IClasses: instance forall k2 k1 (a :: k1 -> k2 -> GHC.Types.*) (b :: k1 -> k2 -> GHC.Types.*) (i :: k1) (j :: k2). (Language.Hakaru.Syntax.IClasses.Show2 a, Language.Hakaru.Syntax.IClasses.Show2 b) => GHC.Show.Show (Language.Hakaru.Syntax.IClasses.Pair2 a b i j)
- Language.Hakaru.Syntax.IClasses: instance forall k2 k1 (a :: k1 -> k2 -> GHC.Types.*) (b :: k1 -> k2 -> GHC.Types.*). (Language.Hakaru.Syntax.IClasses.Show2 a, Language.Hakaru.Syntax.IClasses.Show2 b) => Language.Hakaru.Syntax.IClasses.Show2 (Language.Hakaru.Syntax.IClasses.Pair2 a b)
- Language.Hakaru.Syntax.IClasses: instance forall k2 k1 (a :: k1 -> k2 -> GHC.Types.*). Language.Hakaru.Syntax.IClasses.JmEq2 a => GHC.Classes.Eq (Language.Hakaru.Syntax.IClasses.Some2 a)
- Language.Hakaru.Syntax.IClasses: instance forall k2 k1 (a :: k1 -> k2 -> GHC.Types.*). Language.Hakaru.Syntax.IClasses.Show2 a => GHC.Show.Show (Language.Hakaru.Syntax.IClasses.Some2 a)
- Language.Hakaru.Syntax.TypeCheck: instance GHC.Base.Applicative Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad
- Language.Hakaru.Syntax.TypeCheck: instance GHC.Base.Functor Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad
- Language.Hakaru.Syntax.TypeCheck: instance GHC.Base.Monad Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad
- Language.Hakaru.Syntax.TypeCheck: instance GHC.Read.Read Language.Hakaru.Syntax.TypeCheck.TypeCheckMode
- Language.Hakaru.Syntax.TypeCheck: instance GHC.Show.Show Language.Hakaru.Syntax.TypeCheck.TypeCheckMode
- Language.Hakaru.Syntax.TypeCheck: instance Language.Hakaru.Syntax.ABT.ABT Language.Hakaru.Syntax.AST.Term abt => Language.Hakaru.Types.Coercion.Coerce (Language.Hakaru.Syntax.Datum.Branch a abt)
- Language.Hakaru.Syntax.TypeCheck: instance Language.Hakaru.Syntax.IClasses.Show2 abt => GHC.Show.Show (Language.Hakaru.Syntax.TypeCheck.TypedAST abt)
- Language.Hakaru.Syntax.Variable: instance forall k (abt :: k -> GHC.Types.*). GHC.Base.Monoid (Language.Hakaru.Syntax.Variable.Assocs abt)
- Language.Hakaru.Syntax.Variable: instance forall k (ast :: k -> GHC.Types.*). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 ast) => GHC.Show.Show (Language.Hakaru.Syntax.Variable.Assoc ast)
- Language.Hakaru.Syntax.Variable: instance forall k (ast :: k -> GHC.Types.*). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 ast) => GHC.Show.Show (Language.Hakaru.Syntax.Variable.Assocs ast)
+ Data.Number.Nat: instance Data.Data.Data Data.Number.Nat.Nat
+ Data.Number.Nat: instance GHC.Base.Semigroup Data.Number.Nat.MaxNat
+ Data.Number.Natural: instance GHC.Base.Semigroup Data.Number.Natural.MaxNatural
+ Language.Hakaru.CodeGen.CodeGenMonad: [simd] :: CG -> Bool
+ Language.Hakaru.CodeGen.CodeGenMonad: parDo :: CodeGen a -> CodeGen a
+ Language.Hakaru.CodeGen.CodeGenMonad: seqDo :: CodeGen a -> CodeGen a
+ Language.Hakaru.CodeGen.CodeGenMonad: whenPar :: CodeGen () -> CodeGen ()
+ Language.Hakaru.CodeGen.Libs: Critical :: Directive
+ Language.Hakaru.CodeGen.Libs: DeclareRed :: Ident -> CTypeSpec -> CExpr -> CExpr -> Directive
+ Language.Hakaru.CodeGen.Libs: For :: Directive
+ Language.Hakaru.CodeGen.Libs: OMP :: Directive -> OMP
+ Language.Hakaru.CodeGen.Libs: Parallel :: [Directive] -> Directive
+ Language.Hakaru.CodeGen.Libs: Reduction :: (Either CBinaryOp Ident) -> [CExpr] -> Directive
+ Language.Hakaru.CodeGen.Libs: data Directive
+ Language.Hakaru.CodeGen.Libs: data OMP
+ Language.Hakaru.CodeGen.Libs: ompToPP :: OMP -> Preprocessor
+ Language.Hakaru.CodeGen.Types: closureStructure :: forall (a :: Hakaru) xs. [SomeVariable (KindOf a)] -> List1 Variable (xs :: [Hakaru]) -> Ident -> Sing a -> CExtDecl
+ Language.Hakaru.CodeGen.Types: datumIndex :: CExpr -> CExpr
+ Language.Hakaru.Command: Source :: Maybe FilePath -> Text -> Source
+ Language.Hakaru.Command: [file] :: Source -> Maybe FilePath
+ Language.Hakaru.Command: [source] :: Source -> Text
+ Language.Hakaru.Command: data Source
+ Language.Hakaru.Command: fileSource :: FilePath -> Text -> Source
+ Language.Hakaru.Command: noFileSource :: Text -> Source
+ Language.Hakaru.Command: parseAndInferWithMode :: ABT Term abt => Text -> TypeCheckMode -> Either Text (TypedAST abt)
+ Language.Hakaru.Command: parseAndInferWithMode' :: ABT Term abt => Source -> TypeCheckMode -> IO (Either Text (TypedAST abt))
+ Language.Hakaru.Command: readFromFile' :: String -> IO Source
+ Language.Hakaru.Command: sourceInput :: Source -> Maybe (Vector Text)
+ Language.Hakaru.Disintegrate: densityInCtx :: (ABT Term abt) => TransformCtx -> abt '[] ( 'HMeasure a) -> [abt '[] (a :-> 'HProb)]
+ Language.Hakaru.Disintegrate: disintegrateInCtx :: (ABT Term abt) => TransformCtx -> abt '[] ( 'HMeasure (HPair a b)) -> [abt '[] (a :-> 'HMeasure b)]
+ Language.Hakaru.Disintegrate: observeInCtx :: (ABT Term abt) => TransformCtx -> abt '[] ( 'HMeasure a) -> abt '[] a -> [abt '[] ( 'HMeasure a)]
+ Language.Hakaru.Evaluation.DisintegrationMonad: runDisInCtx :: (ABT Term abt, Foldable f) => TransformCtx -> Dis abt (abt '[] a) -> f (Some2 abt) -> [abt '[] ( 'HMeasure a)]
+ Language.Hakaru.Expect: determineExpect :: (ABT Term abt) => abt '[] 'HProb -> Maybe (abt '[] 'HProb)
+ Language.Hakaru.Expect: expectInCtx :: (ABT Term abt) => TransformCtx -> abt '[] ( 'HMeasure a) -> abt '[a] 'HProb -> abt '[] 'HProb
+ Language.Hakaru.Inference: mcmc' :: (ABT Term abt) => TransformCtx -> abt '[] (a :-> 'HMeasure a) -> abt '[] ( 'HMeasure a) -> Maybe (abt '[] (a :-> 'HMeasure a))
+ Language.Hakaru.Inference: mh' :: (ABT Term abt) => TransformCtx -> abt '[] (a :-> 'HMeasure a) -> abt '[] ( 'HMeasure a) -> Maybe (abt '[] (a :-> 'HMeasure (HPair a 'HProb)))
+ Language.Hakaru.Maple: MapleAmbiguousCommand :: String -> [String] -> MapleException
+ Language.Hakaru.Maple: MultipleErrors :: [MapleException] -> MapleException
+ Language.Hakaru.Maple: [MapleCommand] :: !(Transform '['('[], i)] o) -> MapleCommand i o
+ Language.Hakaru.Maple: [context] :: MapleOptions nm -> TransformCtx
+ Language.Hakaru.Maple: data MapleCommand (i :: Hakaru) (o :: Hakaru)
+ Language.Hakaru.Parser.AST: Choose :: PrimOp
+ Language.Hakaru.Parser.AST: Disint :: TransformImpl -> Transform'
+ Language.Hakaru.Parser.AST: Floor :: PrimOp
+ Language.Hakaru.Parser.AST: MCMC :: Transform'
+ Language.Hakaru.Parser.AST: MH :: Transform'
+ Language.Hakaru.Parser.AST: Reparam :: Transform'
+ Language.Hakaru.Parser.AST: SArgs' :: [([a], AST' a)] -> SArgs' a
+ Language.Hakaru.Parser.AST: Simplify :: Transform'
+ Language.Hakaru.Parser.AST: Summarize :: Transform'
+ Language.Hakaru.Parser.AST: Transform :: Transform' -> (SArgs' a) -> AST' a
+ Language.Hakaru.Parser.AST: [:*] :: !(List2 ToUntyped vars varsu, abt varsu 'U) -> !(SArgs abt args) -> SArgs abt ('(vars, a) : args)
+ Language.Hakaru.Parser.AST: [End] :: SArgs abt '[]
+ Language.Hakaru.Parser.AST: [InjTyped] :: (forall abt'. ABT Term abt' => abt' '[] x) -> Term abt 'U
+ Language.Hakaru.Parser.AST: [ToU] :: ToUntyped x 'U
+ Language.Hakaru.Parser.AST: [Transform_] :: Transform as x -> SArgs abt as -> Term abt 'U
+ Language.Hakaru.Parser.AST: _Expect :: a -> AST' a -> AST' a -> AST' a
+ Language.Hakaru.Parser.AST: data SArgs (abt :: [Untyped] -> Untyped -> *) (as :: [([k], k)])
+ Language.Hakaru.Parser.AST: data ToUntyped (x :: k) (y :: Untyped)
+ Language.Hakaru.Parser.AST: data Transform'
+ Language.Hakaru.Parser.AST: instance Data.Data.Data Language.Hakaru.Parser.AST.ArrayOp
+ Language.Hakaru.Parser.AST: instance Data.Data.Data Language.Hakaru.Parser.AST.Literal'
+ Language.Hakaru.Parser.AST: instance Data.Data.Data Language.Hakaru.Parser.AST.Name
+ Language.Hakaru.Parser.AST: instance Data.Data.Data Language.Hakaru.Parser.AST.NaryOp
+ Language.Hakaru.Parser.AST: instance Data.Data.Data Language.Hakaru.Parser.AST.SourceSpan
+ Language.Hakaru.Parser.AST: instance Data.Data.Data Language.Hakaru.Parser.AST.Transform'
+ Language.Hakaru.Parser.AST: instance Data.Data.Data Language.Hakaru.Parser.AST.TypeAST'
+ Language.Hakaru.Parser.AST: instance Data.Data.Data a => Data.Data.Data (Language.Hakaru.Parser.AST.AST' a)
+ Language.Hakaru.Parser.AST: instance Data.Data.Data a => Data.Data.Data (Language.Hakaru.Parser.AST.Branch' a)
+ Language.Hakaru.Parser.AST: instance Data.Data.Data a => Data.Data.Data (Language.Hakaru.Parser.AST.PDatum a)
+ Language.Hakaru.Parser.AST: instance Data.Data.Data a => Data.Data.Data (Language.Hakaru.Parser.AST.Pattern' a)
+ Language.Hakaru.Parser.AST: instance Data.Data.Data a => Data.Data.Data (Language.Hakaru.Parser.AST.Reducer' a)
+ Language.Hakaru.Parser.AST: instance Data.Data.Data a => Data.Data.Data (Language.Hakaru.Parser.AST.SArgs' a)
+ Language.Hakaru.Parser.AST: instance GHC.Classes.Eq Language.Hakaru.Parser.AST.Transform'
+ Language.Hakaru.Parser.AST: instance GHC.Classes.Eq a => GHC.Classes.Eq (Language.Hakaru.Parser.AST.SArgs' a)
+ Language.Hakaru.Parser.AST: instance GHC.Show.Show Language.Hakaru.Parser.AST.Transform'
+ Language.Hakaru.Parser.AST: instance GHC.Show.Show a => GHC.Show.Show (Language.Hakaru.Parser.AST.SArgs' a)
+ Language.Hakaru.Parser.AST: instance Language.Hakaru.Syntax.IClasses.Foldable21 Language.Hakaru.Parser.AST.SArgs
+ Language.Hakaru.Parser.AST: instance Language.Hakaru.Syntax.IClasses.Functor21 Language.Hakaru.Parser.AST.SArgs
+ Language.Hakaru.Parser.AST: newtype SArgs' a
+ Language.Hakaru.Parser.AST: trFromTyped :: Transform as x -> Transform'
+ Language.Hakaru.Parser.AST: withoutMeta :: AST' a -> AST' a
+ Language.Hakaru.Parser.AST: withoutMetaE :: forall a. Data a => AST' a -> AST' a
+ Language.Hakaru.Pretty.Concrete: instance Language.Hakaru.Syntax.ABT.ABT Language.Hakaru.Syntax.AST.Term abt => Language.Hakaru.Pretty.Concrete.Pretty (Language.Hakaru.Syntax.Reducer.Reducer abt xs)
+ Language.Hakaru.Pretty.Concrete: prettyT :: (ABT Term abt) => abt '[] a -> Text
+ Language.Hakaru.Pretty.Concrete: prettyTypeS :: Sing (a :: Hakaru) -> String
+ Language.Hakaru.Pretty.Concrete: prettyTypeT :: Sing (a :: Hakaru) -> Text
+ Language.Hakaru.Pretty.Haskell: prettyString :: (ABT Term abt) => Sing a -> abt '[] a -> Doc
+ Language.Hakaru.Pretty.Haskell: prettyType :: Sing (a :: Hakaru) -> Doc
+ Language.Hakaru.Pretty.SExpression: fromAst :: Either Text (TypedAST (TrivialABT Term)) -> String
+ Language.Hakaru.Pretty.SExpression: goCode :: PDatumCode xss vars a -> Doc
+ Language.Hakaru.Pretty.SExpression: goFun :: PDatumFun x vars a -> Doc
+ Language.Hakaru.Pretty.SExpression: goStruct :: PDatumStruct xs vars a -> Doc
+ Language.Hakaru.Pretty.SExpression: pCoerce :: Coercion a b -> String
+ Language.Hakaru.Pretty.SExpression: pUnsafeCoerce :: Coercion a b -> String
+ Language.Hakaru.Pretty.SExpression: pretty :: (ABT Term abt) => abt '[] a -> Doc
+ Language.Hakaru.Pretty.SExpression: prettyArrayOp :: (ABT Term abt, typs ~ UnLCs args, args ~ LCs typs) => ArrayOp typs a -> SArgs abt args -> Doc
+ Language.Hakaru.Pretty.SExpression: prettyBranch :: (ABT Term abt) => Branch a abt b -> Doc
+ Language.Hakaru.Pretty.SExpression: prettyDatum :: (ABT Term abt) => Datum (abt '[]) t -> Doc
+ Language.Hakaru.Pretty.SExpression: prettyDatumCode :: (ABT Term abt) => DatumCode xss (abt '[]) a -> Doc
+ Language.Hakaru.Pretty.SExpression: prettyDatumFun :: (ABT Term abt) => DatumFun x (abt '[]) a -> Doc
+ Language.Hakaru.Pretty.SExpression: prettyDatumStruct :: (ABT Term abt) => DatumStruct xs (abt '[]) a -> Doc
+ Language.Hakaru.Pretty.SExpression: prettyFile' :: [Char] -> [Char] -> IO ()
+ Language.Hakaru.Pretty.SExpression: prettyLiteral :: Literal a -> Doc
+ Language.Hakaru.Pretty.SExpression: prettyMeasureOp :: (ABT Term abt, typs ~ UnLCs args, args ~ LCs typs) => MeasureOp typs a -> SArgs abt args -> Doc
+ Language.Hakaru.Pretty.SExpression: prettyNary :: (ABT Term abt) => NaryOp a -> Seq (abt '[] a) -> Doc
+ Language.Hakaru.Pretty.SExpression: prettyPattern :: Pattern xs a -> Doc
+ Language.Hakaru.Pretty.SExpression: prettyPrimOp :: (ABT Term abt, typs ~ UnLCs args, args ~ LCs typs) => PrimOp typs a -> SArgs abt args -> Doc
+ Language.Hakaru.Pretty.SExpression: prettyRatio :: (Show a, Integral a) => Ratio a -> Doc
+ Language.Hakaru.Pretty.SExpression: prettyReducer :: (ABT Term abt) => Reducer abt xs a -> Doc
+ Language.Hakaru.Pretty.SExpression: prettySCons :: (ABT Term abt) => SCon args a -> SArgs abt args -> Doc
+ Language.Hakaru.Pretty.SExpression: prettyShow :: (Show a) => a -> Doc
+ Language.Hakaru.Pretty.SExpression: prettyTerm :: (ABT Term abt) => Term abt a -> Doc
+ Language.Hakaru.Pretty.SExpression: prettyType :: Sing (a :: Hakaru) -> Doc
+ Language.Hakaru.Pretty.SExpression: prettyVariable :: Variable (a :: Hakaru) -> Doc
+ Language.Hakaru.Pretty.SExpression: prettyView :: (ABT Term abt) => View (Term abt) xs a -> Doc
+ Language.Hakaru.Pretty.SExpression: prettyViewABT :: (ABT Term abt) => abt xs a -> Doc
+ Language.Hakaru.Pretty.SExpression: runPretty' :: Text -> IO String
+ Language.Hakaru.Runtime.CmdLine: Measure :: GenIO -> IO (Maybe a) -> Measure a
+ Language.Hakaru.Runtime.CmdLine: [unMeasure] :: Measure a -> GenIO -> IO (Maybe a)
+ Language.Hakaru.Runtime.CmdLine: instance (GHC.Read.Read a, GHC.Read.Read b) => Language.Hakaru.Runtime.CmdLine.Parseable (a, b)
+ Language.Hakaru.Runtime.CmdLine: instance GHC.Base.Applicative Language.Hakaru.Runtime.CmdLine.Measure
+ Language.Hakaru.Runtime.CmdLine: instance GHC.Base.Functor Language.Hakaru.Runtime.CmdLine.Measure
+ Language.Hakaru.Runtime.CmdLine: instance GHC.Base.Monad Language.Hakaru.Runtime.CmdLine.Measure
+ Language.Hakaru.Runtime.CmdLine: instance GHC.Show.Show a => Language.Hakaru.Runtime.CmdLine.MakeMain (Language.Hakaru.Runtime.CmdLine.Measure a)
+ Language.Hakaru.Runtime.CmdLine: instance GHC.Show.Show a => Language.Hakaru.Runtime.CmdLine.MakeMain a
+ Language.Hakaru.Runtime.CmdLine: makeMeasure :: (GenIO -> IO a) -> Measure a
+ Language.Hakaru.Runtime.CmdLine: newtype Measure a
+ Language.Hakaru.Runtime.LogFloatPrelude: betaFunc :: Prob -> Prob -> Prob
+ Language.Hakaru.Runtime.LogFloatPrelude: instance GHC.Read.Read Data.Number.LogFloat.LogFloat
+ Language.Hakaru.Runtime.LogFloatPrelude: instance Language.Hakaru.Runtime.CmdLine.Parseable Data.Number.LogFloat.LogFloat
+ Language.Hakaru.Runtime.LogFloatPrelude: left :: a -> Either a b
+ Language.Hakaru.Runtime.LogFloatPrelude: pleft :: Pattern -> (a -> c) -> Branch (Either a b) c
+ Language.Hakaru.Runtime.LogFloatPrelude: pright :: Pattern -> (b -> c) -> Branch (Either a b) c
+ Language.Hakaru.Runtime.LogFloatPrelude: reduce :: (Vector (MayBoxVec a) a) => (a -> a -> a) -> a -> MayBoxVec a a -> a
+ Language.Hakaru.Runtime.LogFloatPrelude: right :: b -> Either a b
+ Language.Hakaru.Runtime.LogFloatPrelude: type Prob = LogFloat
+ Language.Hakaru.Runtime.Prelude: type Prob = Double
+ Language.Hakaru.Sample: intToNatural :: Int -> Natural
+ Language.Hakaru.Sample: unsafeInt :: Natural -> Int
+ Language.Hakaru.Simplify: simplify' :: forall abt a. (ABT Term (abt Term)) => TypedAST (abt Term) -> IO (TypedAST (abt Term))
+ Language.Hakaru.Simplify: simplifyWithOpts :: forall abt a. (ABT Term abt) => MapleOptions () -> abt '[] a -> IO (abt '[] a)
+ Language.Hakaru.Syntax.ABT: dupABT :: (ABT syn abt0, ABT syn abt1, Functor21 syn) => abt0 xs a -> abt1 xs a
+ Language.Hakaru.Syntax.ABT: instance forall a (syn :: ([a] -> a -> *) -> a -> *) (abt :: [a] -> a -> *) (xs :: [a]) as (x :: a). (Language.Hakaru.Syntax.ABT.Binders syn abt xs as, Language.Hakaru.Types.Sing.SingI x) => Language.Hakaru.Syntax.ABT.Binders syn abt (x : xs) (abt '[] x, as)
+ Language.Hakaru.Syntax.ABT: instance forall k (rec :: k -> *) (xs :: [k]) (a :: k). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 rec) => GHC.Show.Show (Language.Hakaru.Syntax.ABT.View rec xs a)
+ Language.Hakaru.Syntax.ABT: instance forall k (rec :: k -> *) (xs :: [k]). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 rec) => Language.Hakaru.Syntax.IClasses.Show1 (Language.Hakaru.Syntax.ABT.View rec xs)
+ Language.Hakaru.Syntax.ABT: instance forall k (rec :: k -> *). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 rec) => Language.Hakaru.Syntax.IClasses.Show2 (Language.Hakaru.Syntax.ABT.View rec)
+ Language.Hakaru.Syntax.ABT: instance forall k (syn :: ([k] -> k -> *) -> k -> *) (abt :: [k] -> k -> *). Language.Hakaru.Syntax.ABT.ABT syn abt => Language.Hakaru.Syntax.ABT.Binders syn abt '[] ()
+ Language.Hakaru.Syntax.ABT: instance forall k (syn :: ([k] -> k -> *) -> k -> *) (xs :: [k]) (a :: k). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 (syn (Language.Hakaru.Syntax.ABT.MemoizedABT syn))) => GHC.Show.Show (Language.Hakaru.Syntax.ABT.MemoizedABT syn xs a)
+ Language.Hakaru.Syntax.ABT: instance forall k (syn :: ([k] -> k -> *) -> k -> *) (xs :: [k]) (a :: k). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 (syn (Language.Hakaru.Syntax.ABT.TrivialABT syn))) => GHC.Show.Show (Language.Hakaru.Syntax.ABT.TrivialABT syn xs a)
+ Language.Hakaru.Syntax.ABT: instance forall k (syn :: ([k] -> k -> *) -> k -> *) (xs :: [k]). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 (syn (Language.Hakaru.Syntax.ABT.MemoizedABT syn))) => Language.Hakaru.Syntax.IClasses.Show1 (Language.Hakaru.Syntax.ABT.MemoizedABT syn xs)
+ Language.Hakaru.Syntax.ABT: instance forall k (syn :: ([k] -> k -> *) -> k -> *) (xs :: [k]). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 (syn (Language.Hakaru.Syntax.ABT.TrivialABT syn))) => Language.Hakaru.Syntax.IClasses.Show1 (Language.Hakaru.Syntax.ABT.TrivialABT syn xs)
+ Language.Hakaru.Syntax.ABT: instance forall k (syn :: ([k] -> k -> *) -> k -> *) meta (xs :: [k]) (a :: k). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 (syn (Language.Hakaru.Syntax.ABT.MetaABT meta syn)), GHC.Show.Show meta) => GHC.Show.Show (Language.Hakaru.Syntax.ABT.MetaABT meta syn xs a)
+ Language.Hakaru.Syntax.ABT: instance forall k (syn :: ([k] -> k -> *) -> k -> *) meta (xs :: [k]). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 (syn (Language.Hakaru.Syntax.ABT.MetaABT meta syn)), GHC.Show.Show meta) => Language.Hakaru.Syntax.IClasses.Show1 (Language.Hakaru.Syntax.ABT.MetaABT meta syn xs)
+ Language.Hakaru.Syntax.ABT: instance forall k (syn :: ([k] -> k -> *) -> k -> *) meta. (Language.Hakaru.Syntax.IClasses.JmEq1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Foldable21 syn) => Language.Hakaru.Syntax.ABT.ABT syn (Language.Hakaru.Syntax.ABT.MetaABT meta syn)
+ Language.Hakaru.Syntax.ABT: instance forall k (syn :: ([k] -> k -> *) -> k -> *) meta. (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 (syn (Language.Hakaru.Syntax.ABT.MetaABT meta syn)), GHC.Show.Show meta) => Language.Hakaru.Syntax.IClasses.Show2 (Language.Hakaru.Syntax.ABT.MetaABT meta syn)
+ Language.Hakaru.Syntax.ABT: instance forall k (syn :: ([k] -> k -> *) -> k -> *). (Language.Hakaru.Syntax.IClasses.JmEq1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Foldable21 syn) => Language.Hakaru.Syntax.ABT.ABT syn (Language.Hakaru.Syntax.ABT.MemoizedABT syn)
+ Language.Hakaru.Syntax.ABT: instance forall k (syn :: ([k] -> k -> *) -> k -> *). (Language.Hakaru.Syntax.IClasses.JmEq1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Foldable21 syn) => Language.Hakaru.Syntax.ABT.ABT syn (Language.Hakaru.Syntax.ABT.TrivialABT syn)
+ Language.Hakaru.Syntax.ABT: instance forall k (syn :: ([k] -> k -> *) -> k -> *). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 (syn (Language.Hakaru.Syntax.ABT.MemoizedABT syn))) => Language.Hakaru.Syntax.IClasses.Show2 (Language.Hakaru.Syntax.ABT.MemoizedABT syn)
+ Language.Hakaru.Syntax.ABT: instance forall k (syn :: ([k] -> k -> *) -> k -> *). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 (syn (Language.Hakaru.Syntax.ABT.TrivialABT syn))) => Language.Hakaru.Syntax.IClasses.Show2 (Language.Hakaru.Syntax.ABT.TrivialABT syn)
+ Language.Hakaru.Syntax.AST: InHaskell :: TransformImpl
+ Language.Hakaru.Syntax.AST: InMaple :: TransformImpl
+ Language.Hakaru.Syntax.AST: [Choose] :: PrimOp '[ 'HNat, 'HNat] 'HNat
+ Language.Hakaru.Syntax.AST: [Disint] :: TransformImpl -> Transform '[LC ( 'HMeasure (HPair a b))] (a :-> 'HMeasure b)
+ Language.Hakaru.Syntax.AST: [Floor] :: PrimOp '[ 'HProb] 'HNat
+ Language.Hakaru.Syntax.AST: [MCMC] :: Transform '[LC (a :-> 'HMeasure a), LC ( 'HMeasure a)] (a :-> 'HMeasure a)
+ Language.Hakaru.Syntax.AST: [MH] :: Transform '[LC (a :-> 'HMeasure a), LC ( 'HMeasure a)] (a :-> 'HMeasure (HPair a 'HProb))
+ Language.Hakaru.Syntax.AST: [Reparam] :: Transform '[LC a] a
+ Language.Hakaru.Syntax.AST: [Simplify] :: Transform '[LC a] a
+ Language.Hakaru.Syntax.AST: [Summarize] :: Transform '[LC a] a
+ Language.Hakaru.Syntax.AST: [Transform_] :: !(Transform as x) -> SCon as x
+ Language.Hakaru.Syntax.AST: data Transform :: [([Hakaru], Hakaru)] -> Hakaru -> *
+ Language.Hakaru.Syntax.AST: data TransformImpl
+ Language.Hakaru.Syntax.AST.Eq: instance Language.Hakaru.Syntax.IClasses.JmEq2 abt => Language.Hakaru.Syntax.IClasses.JmEq1 (Language.Hakaru.Syntax.SArgs.SArgs abt)
+ Language.Hakaru.Syntax.AST.Eq: instance forall k (syn :: ([k] -> k -> *) -> k -> *) (xs :: [k]) (a :: k). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.JmEq1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Foldable21 syn, Language.Hakaru.Syntax.IClasses.JmEq1 (syn (Language.Hakaru.Syntax.ABT.TrivialABT syn))) => GHC.Classes.Eq (Language.Hakaru.Syntax.ABT.TrivialABT syn xs a)
+ Language.Hakaru.Syntax.AST.Eq: instance forall k (syn :: ([k] -> k -> *) -> k -> *) (xs :: [k]). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.JmEq1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Foldable21 syn, Language.Hakaru.Syntax.IClasses.JmEq1 (syn (Language.Hakaru.Syntax.ABT.TrivialABT syn))) => Language.Hakaru.Syntax.IClasses.Eq1 (Language.Hakaru.Syntax.ABT.TrivialABT syn xs)
+ Language.Hakaru.Syntax.AST.Eq: instance forall k (syn :: ([k] -> k -> *) -> k -> *) (xs :: [k]). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.JmEq1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.JmEq1 (syn (Language.Hakaru.Syntax.ABT.TrivialABT syn)), Language.Hakaru.Syntax.IClasses.Foldable21 syn) => Language.Hakaru.Syntax.IClasses.JmEq1 (Language.Hakaru.Syntax.ABT.TrivialABT syn xs)
+ Language.Hakaru.Syntax.AST.Eq: instance forall k (syn :: ([k] -> k -> *) -> k -> *). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.JmEq1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Foldable21 syn, Language.Hakaru.Syntax.IClasses.JmEq1 (syn (Language.Hakaru.Syntax.ABT.TrivialABT syn))) => Language.Hakaru.Syntax.IClasses.Eq2 (Language.Hakaru.Syntax.ABT.TrivialABT syn)
+ Language.Hakaru.Syntax.AST.Eq: instance forall k (syn :: ([k] -> k -> *) -> k -> *). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.JmEq1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.JmEq1 (syn (Language.Hakaru.Syntax.ABT.TrivialABT syn)), Language.Hakaru.Syntax.IClasses.Foldable21 syn) => Language.Hakaru.Syntax.IClasses.JmEq2 (Language.Hakaru.Syntax.ABT.TrivialABT syn)
+ Language.Hakaru.Syntax.AST.Eq: jmEq_Transform :: Transform args a -> Transform args a' -> Maybe (TypeEq a a')
+ Language.Hakaru.Syntax.AST.Transforms: allTransformations :: ABT Term abt => TransformTable abt IO
+ Language.Hakaru.Syntax.AST.Transforms: allTransformationsWithMOpts :: ABT Term abt => MapleOptions () -> TransformTable abt IO
+ Language.Hakaru.Syntax.AST.Transforms: expandAllTransformations :: forall abt a. (ABT Term abt) => abt '[] a -> IO (abt '[] a)
+ Language.Hakaru.Syntax.AST.Transforms: expandTransformationsWith :: forall abt a m. (ABT Term abt, Applicative m, Monad m) => TransformTable abt m -> abt '[] a -> m (abt '[] a)
+ Language.Hakaru.Syntax.AST.Transforms: expandTransformationsWith' :: forall abt a. (ABT Term abt) => TransformTable abt Identity -> abt '[] a -> abt '[] a
+ Language.Hakaru.Syntax.AST.Transforms: haskellTransformations :: (Applicative m, ABT Term abt) => TransformTable abt m
+ Language.Hakaru.Syntax.AST.Transforms: mapleTransformations :: ABT Term abt => TransformTable abt IO
+ Language.Hakaru.Syntax.AST.Transforms: mapleTransformationsWithOpts :: forall abt. ABT Term abt => MapleOptions () -> TransformTable abt IO
+ Language.Hakaru.Syntax.AST.Transforms: type TransformM = StateT TransformCtx
+ Language.Hakaru.Syntax.AST.Transforms: underLam' :: forall abt m a b b'. (ABT Term abt, MonadFix m) => (abt '[] b -> m (abt '[] b')) -> abt '[] (a :-> b) -> m (abt '[] (a :-> b'))
+ Language.Hakaru.Syntax.AST.Transforms: underLam'p :: forall abt a b b'. (ABT Term abt) => (abt '[] b -> abt '[] b') -> abt '[] (a :-> b) -> abt '[] (a :-> b')
+ Language.Hakaru.Syntax.Datum: dBool :: Bool -> Datum ast HBool
+ Language.Hakaru.Syntax.Hoist: instance Language.Hakaru.Syntax.ABT.ABT Language.Hakaru.Syntax.AST.Term abt => GHC.Base.Semigroup (Language.Hakaru.Syntax.Hoist.ExpressionSet abt)
+ Language.Hakaru.Syntax.IClasses: [Cons2] :: f x y -> List2 f xs ys -> List2 f (x : xs) (y : ys)
+ Language.Hakaru.Syntax.IClasses: [Holds] :: c x => Holds c x
+ Language.Hakaru.Syntax.IClasses: [Nil2] :: List2 f '[] '[]
+ Language.Hakaru.Syntax.IClasses: [PwP] :: f x -> g y -> PointwiseP f g '(x, y)
+ Language.Hakaru.Syntax.IClasses: [Pw] :: f x -> g y -> Pointwise f g x y
+ Language.Hakaru.Syntax.IClasses: allHolds :: All c xs => List1 (Holds c) xs
+ Language.Hakaru.Syntax.IClasses: class All (c :: k -> Constraint) (xs :: [k])
+ Language.Hakaru.Syntax.IClasses: data Holds (c :: k -> Constraint) (x :: k)
+ Language.Hakaru.Syntax.IClasses: data List2 :: (k0 -> k1 -> *) -> [k0] -> [k1] -> *
+ Language.Hakaru.Syntax.IClasses: data Pointwise (f :: k0 -> *) (g :: k1 -> *) (x :: k0) (y :: k1)
+ Language.Hakaru.Syntax.IClasses: data PointwiseP (f :: k0 -> *) (g :: k1 -> *) (xy :: (k0, k1))
+ Language.Hakaru.Syntax.IClasses: instance forall a (c :: a -> GHC.Types.Constraint) (xs :: [a]) (x :: a). (Language.Hakaru.Syntax.IClasses.All c xs, c x) => Language.Hakaru.Syntax.IClasses.All c (x : xs)
+ Language.Hakaru.Syntax.IClasses: instance forall k (a :: k -> *) (b :: k -> *) (i :: k). (Language.Hakaru.Syntax.IClasses.Show1 a, Language.Hakaru.Syntax.IClasses.Show1 b) => GHC.Show.Show (Language.Hakaru.Syntax.IClasses.Pair1 a b i)
+ Language.Hakaru.Syntax.IClasses: instance forall k (a :: k -> *) (b :: k -> *). (Language.Hakaru.Syntax.IClasses.Show1 a, Language.Hakaru.Syntax.IClasses.Show1 b) => Language.Hakaru.Syntax.IClasses.Show1 (Language.Hakaru.Syntax.IClasses.Pair1 a b)
+ Language.Hakaru.Syntax.IClasses: instance forall k (a :: k -> *) (xs :: [k]). Language.Hakaru.Syntax.IClasses.Eq1 a => GHC.Classes.Eq (Language.Hakaru.Syntax.IClasses.List1 a xs)
+ Language.Hakaru.Syntax.IClasses: instance forall k (a :: k -> *) (xs :: [k]). Language.Hakaru.Syntax.IClasses.Show1 a => GHC.Show.Show (Language.Hakaru.Syntax.IClasses.List1 a xs)
+ Language.Hakaru.Syntax.IClasses: instance forall k (a :: k -> *). Language.Hakaru.Syntax.IClasses.Eq1 a => Language.Hakaru.Syntax.IClasses.Eq1 (Language.Hakaru.Syntax.IClasses.List1 a)
+ Language.Hakaru.Syntax.IClasses: instance forall k (a :: k -> *). Language.Hakaru.Syntax.IClasses.JmEq1 a => GHC.Classes.Eq (Language.Hakaru.Syntax.IClasses.Some1 a)
+ Language.Hakaru.Syntax.IClasses: instance forall k (a :: k -> *). Language.Hakaru.Syntax.IClasses.JmEq1 a => Language.Hakaru.Syntax.IClasses.JmEq1 (Language.Hakaru.Syntax.IClasses.List1 a)
+ Language.Hakaru.Syntax.IClasses: instance forall k (a :: k -> *). Language.Hakaru.Syntax.IClasses.Show1 a => GHC.Show.Show (Language.Hakaru.Syntax.IClasses.Some1 a)
+ Language.Hakaru.Syntax.IClasses: instance forall k (a :: k -> *). Language.Hakaru.Syntax.IClasses.Show1 a => Language.Hakaru.Syntax.IClasses.Show1 (Language.Hakaru.Syntax.IClasses.List1 a)
+ Language.Hakaru.Syntax.IClasses: instance forall k (c :: k -> GHC.Types.Constraint). Language.Hakaru.Syntax.IClasses.All c '[]
+ Language.Hakaru.Syntax.IClasses: instance forall k1 k (a :: k1 -> k -> *) (b :: k1 -> k -> *) (i :: k1). (Language.Hakaru.Syntax.IClasses.Show2 a, Language.Hakaru.Syntax.IClasses.Show2 b) => Language.Hakaru.Syntax.IClasses.Show1 (Language.Hakaru.Syntax.IClasses.Pair2 a b i)
+ Language.Hakaru.Syntax.IClasses: instance forall k1 k2 (a :: k1 -> k2 -> *) (b :: k1 -> k2 -> *) (i :: k1) (j :: k2). (Language.Hakaru.Syntax.IClasses.Show2 a, Language.Hakaru.Syntax.IClasses.Show2 b) => GHC.Show.Show (Language.Hakaru.Syntax.IClasses.Pair2 a b i j)
+ Language.Hakaru.Syntax.IClasses: instance forall k1 k2 (a :: k1 -> k2 -> *) (b :: k1 -> k2 -> *). (Language.Hakaru.Syntax.IClasses.Show2 a, Language.Hakaru.Syntax.IClasses.Show2 b) => Language.Hakaru.Syntax.IClasses.Show2 (Language.Hakaru.Syntax.IClasses.Pair2 a b)
+ Language.Hakaru.Syntax.IClasses: instance forall k1 k2 (a :: k1 -> k2 -> *). Language.Hakaru.Syntax.IClasses.JmEq2 a => GHC.Classes.Eq (Language.Hakaru.Syntax.IClasses.Some2 a)
+ Language.Hakaru.Syntax.IClasses: instance forall k1 k2 (a :: k1 -> k2 -> *). Language.Hakaru.Syntax.IClasses.Show2 a => GHC.Show.Show (Language.Hakaru.Syntax.IClasses.Some2 a)
+ Language.Hakaru.Syntax.Prelude: choose :: (ABT Term abt) => abt '[] 'HNat -> abt '[] 'HNat -> abt '[] 'HNat
+ Language.Hakaru.Syntax.Prelude: floor :: (ABT Term abt) => abt '[] 'HProb -> abt '[] 'HNat
+ Language.Hakaru.Syntax.Prelude: lebesgue' :: (ABT Term abt) => abt '[] 'HReal -> abt '[] 'HReal -> abt '[] ( 'HMeasure 'HReal)
+ Language.Hakaru.Syntax.SArgs: [:*] :: !(abt vars a) -> !(SArgs abt args) -> SArgs abt ('(vars, a) : args)
+ Language.Hakaru.Syntax.SArgs: [End] :: SArgs abt '[]
+ Language.Hakaru.Syntax.SArgs: data SArgs :: ([Hakaru] -> Hakaru -> *) -> [([Hakaru], Hakaru)] -> *
+ Language.Hakaru.Syntax.SArgs: getSArgsSing :: forall abt xs m. (Applicative m) => (forall ys a. abt ys a -> m (Sing a)) -> SArgs abt xs -> m (SArgsSing xs)
+ Language.Hakaru.Syntax.SArgs: instance Language.Hakaru.Syntax.IClasses.Eq2 abt => GHC.Classes.Eq (Language.Hakaru.Syntax.SArgs.SArgs abt args)
+ Language.Hakaru.Syntax.SArgs: instance Language.Hakaru.Syntax.IClasses.Eq2 abt => Language.Hakaru.Syntax.IClasses.Eq1 (Language.Hakaru.Syntax.SArgs.SArgs abt)
+ Language.Hakaru.Syntax.SArgs: instance Language.Hakaru.Syntax.IClasses.Foldable21 Language.Hakaru.Syntax.SArgs.SArgs
+ Language.Hakaru.Syntax.SArgs: instance Language.Hakaru.Syntax.IClasses.Functor21 Language.Hakaru.Syntax.SArgs.SArgs
+ Language.Hakaru.Syntax.SArgs: instance Language.Hakaru.Syntax.IClasses.Show2 abt => GHC.Show.Show (Language.Hakaru.Syntax.SArgs.SArgs abt args)
+ Language.Hakaru.Syntax.SArgs: instance Language.Hakaru.Syntax.IClasses.Show2 abt => Language.Hakaru.Syntax.IClasses.Show1 (Language.Hakaru.Syntax.SArgs.SArgs abt)
+ Language.Hakaru.Syntax.SArgs: instance Language.Hakaru.Syntax.IClasses.Traversable21 Language.Hakaru.Syntax.SArgs.SArgs
+ Language.Hakaru.Syntax.SArgs: type LC (a :: Hakaru) = '('[], a)
+ Language.Hakaru.Syntax.SArgs: type SArgsSing = SArgs (Pointwise (Lift1 ()) Sing)
+ Language.Hakaru.Syntax.Transform: InHaskell :: TransformImpl
+ Language.Hakaru.Syntax.Transform: InMaple :: TransformImpl
+ Language.Hakaru.Syntax.Transform: TransformCtx :: Nat -> TransformCtx
+ Language.Hakaru.Syntax.Transform: TransformTable :: forall as b. Transform as b -> Maybe (TransformCtx -> SArgs abt as -> m (Maybe (abt '[] b))) -> TransformTable abt m
+ Language.Hakaru.Syntax.Transform: [Disint] :: TransformImpl -> Transform '[LC ( 'HMeasure (HPair a b))] (a :-> 'HMeasure b)
+ Language.Hakaru.Syntax.Transform: [Expect] :: Transform '[LC ( 'HMeasure a), '('[a], 'HProb)] 'HProb
+ Language.Hakaru.Syntax.Transform: [MCMC] :: Transform '[LC (a :-> 'HMeasure a), LC ( 'HMeasure a)] (a :-> 'HMeasure a)
+ Language.Hakaru.Syntax.Transform: [MH] :: Transform '[LC (a :-> 'HMeasure a), LC ( 'HMeasure a)] (a :-> 'HMeasure (HPair a 'HProb))
+ Language.Hakaru.Syntax.Transform: [Observe] :: Transform '[LC ( 'HMeasure a), LC a] ( 'HMeasure a)
+ Language.Hakaru.Syntax.Transform: [Reparam] :: Transform '[LC a] a
+ Language.Hakaru.Syntax.Transform: [Simplify] :: Transform '[LC a] a
+ Language.Hakaru.Syntax.Transform: [Summarize] :: Transform '[LC a] a
+ Language.Hakaru.Syntax.Transform: [lookupTransform] :: TransformTable abt m -> forall as b. Transform as b -> Maybe (TransformCtx -> SArgs abt as -> m (Maybe (abt '[] b)))
+ Language.Hakaru.Syntax.Transform: [nextFreeVar] :: TransformCtx -> Nat
+ Language.Hakaru.Syntax.Transform: allTransforms :: [Some2 Transform]
+ Language.Hakaru.Syntax.Transform: class HasTransformCtx x
+ Language.Hakaru.Syntax.Transform: ctxOf :: HasTransformCtx x => x -> TransformCtx
+ Language.Hakaru.Syntax.Transform: data Transform :: [([Hakaru], Hakaru)] -> Hakaru -> *
+ Language.Hakaru.Syntax.Transform: data TransformImpl
+ Language.Hakaru.Syntax.Transform: instance Data.Data.Data Language.Hakaru.Syntax.Transform.TransformImpl
+ Language.Hakaru.Syntax.Transform: instance GHC.Base.Monoid Language.Hakaru.Syntax.Transform.TransformCtx
+ Language.Hakaru.Syntax.Transform: instance GHC.Base.Semigroup Language.Hakaru.Syntax.Transform.TransformCtx
+ Language.Hakaru.Syntax.Transform: instance GHC.Classes.Eq (Language.Hakaru.Syntax.IClasses.Some2 Language.Hakaru.Syntax.Transform.Transform)
+ Language.Hakaru.Syntax.Transform: instance GHC.Classes.Eq (Language.Hakaru.Syntax.Transform.Transform args a)
+ Language.Hakaru.Syntax.Transform: instance GHC.Classes.Eq Language.Hakaru.Syntax.Transform.TransformCtx
+ Language.Hakaru.Syntax.Transform: instance GHC.Classes.Eq Language.Hakaru.Syntax.Transform.TransformImpl
+ Language.Hakaru.Syntax.Transform: instance GHC.Classes.Ord Language.Hakaru.Syntax.Transform.TransformCtx
+ Language.Hakaru.Syntax.Transform: instance GHC.Classes.Ord Language.Hakaru.Syntax.Transform.TransformImpl
+ Language.Hakaru.Syntax.Transform: instance GHC.Read.Read (Language.Hakaru.Syntax.IClasses.Some2 Language.Hakaru.Syntax.Transform.Transform)
+ Language.Hakaru.Syntax.Transform: instance GHC.Read.Read Language.Hakaru.Syntax.Transform.TransformImpl
+ Language.Hakaru.Syntax.Transform: instance GHC.Show.Show (Language.Hakaru.Syntax.Transform.Transform args a)
+ Language.Hakaru.Syntax.Transform: instance GHC.Show.Show Language.Hakaru.Syntax.Transform.TransformCtx
+ Language.Hakaru.Syntax.Transform: instance GHC.Show.Show Language.Hakaru.Syntax.Transform.TransformImpl
+ Language.Hakaru.Syntax.Transform: instance Language.Hakaru.Syntax.ABT.ABT syn abt => Language.Hakaru.Syntax.Transform.HasTransformCtx (abt xs a)
+ Language.Hakaru.Syntax.Transform: instance Language.Hakaru.Syntax.Transform.HasTransformCtx (Language.Hakaru.Syntax.Variable.Variable a)
+ Language.Hakaru.Syntax.Transform: lookupTransform' :: (Applicative m) => TransformTable abt m -> Transform as b -> TransformCtx -> SArgs abt as -> m (Maybe (abt '[] b))
+ Language.Hakaru.Syntax.Transform: minimalCtx :: TransformCtx
+ Language.Hakaru.Syntax.Transform: newtype TransformCtx
+ Language.Hakaru.Syntax.Transform: newtype TransformTable abt m
+ Language.Hakaru.Syntax.Transform: simpleTable :: (Applicative m) => (forall as b. Transform as b -> Maybe (TransformCtx -> SArgs abt as -> Maybe (abt '[] b))) -> TransformTable abt m
+ Language.Hakaru.Syntax.Transform: someTransformations :: [Some2 Transform] -> TransformTable abt m -> TransformTable abt m
+ Language.Hakaru.Syntax.Transform: transformName :: Transform args a -> String
+ Language.Hakaru.Syntax.Transform: typeOfTransform :: Transform as x -> SArgsSing as -> Sing x
+ Language.Hakaru.Syntax.Transform: unionCtx :: TransformCtx -> TransformCtx -> TransformCtx
+ Language.Hakaru.Syntax.Transform: unionTable :: TransformTable abt m -> TransformTable abt m -> TransformTable abt m
+ Language.Hakaru.Syntax.TypeCheck: elimTypedAST :: (forall b. Sing b -> abt '[] b -> x) -> TypedAST abt -> x
+ Language.Hakaru.Syntax.TypeCheck: onTypedAST :: (forall b. abt '[] b -> abt '[] b) -> TypedAST abt -> TypedAST abt
+ Language.Hakaru.Syntax.TypeCheck: onTypedASTM :: (Functor m) => (forall b. abt '[] b -> m (abt '[] b)) -> TypedAST abt -> m (TypedAST abt)
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: LaxMode :: TypeCheckMode
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: SP :: !(Pattern vars a) -> !(List1 Variable vars) -> SomePattern
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: SPC :: !(PDatumCode xss vars (HData' t)) -> !(List1 Variable vars) -> SomePatternCode xss t
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: SPF :: !(PDatumFun x vars (HData' t)) -> !(List1 Variable vars) -> SomePatternFun x t
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: SPS :: !(PDatumStruct xs vars (HData' t)) -> !(List1 Variable vars) -> SomePatternStruct xs t
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: SomeBranch :: !(Sing b) -> [Branch a abt b] -> SomeBranch a abt
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: StrictMode :: TypeCheckMode
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: TCM :: Ctx -> Input -> TypeCheckMode -> Either TypeCheckError a -> TypeCheckMonad a
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: TypedAST :: !(Sing b) -> !(abt '[] b) -> TypedAST
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: TypedASTs :: !(Sing b) -> [abt '[] b] -> TypedASTs
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: TypedReducer :: !(Sing b) -> (List1 Variable xs) -> (Reducer abt xs b) -> TypedReducer
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: UnsafeMode :: TypeCheckMode
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: [unTCM] :: TypeCheckMonad a -> Ctx -> Input -> TypeCheckMode -> Either TypeCheckError a
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: ambiguousEmptyNary :: Maybe SourceSpan -> TypeCheckMonad r
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: ambiguousFreeVariable :: Text -> Maybe SourceSpan -> TypeCheckMonad r
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: ambiguousMustCheck :: Maybe SourceSpan -> TypeCheckMonad r
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: ambiguousMustCheckNary :: Maybe SourceSpan -> TypeCheckMonad r
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: ambiguousNullCoercion :: Maybe SourceSpan -> TypeCheckMonad r
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: argumentNumberError :: TypeCheckMonad r
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: coerceFrom_nonLC :: (ABT Term abt) => Coercion a b -> abt xs b -> abt xs a
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: coerceTo_nonLC :: (ABT Term abt) => Coercion a b -> abt xs a -> abt xs b
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: data SomeBranch a abt
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: data SomePattern (a :: Hakaru)
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: data SomePatternCode xss t
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: data SomePatternFun x t
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: data SomePatternStruct xs t
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: data TypeCheckMode
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: data TypedAST (abt :: [Hakaru] -> Hakaru -> *)
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: data TypedASTs (abt :: [Hakaru] -> Hakaru -> *)
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: data TypedReducer (abt :: [Hakaru] -> Hakaru -> *) (xs :: [Hakaru])
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: elimTypedAST :: (forall b. Sing b -> abt '[] b -> x) -> TypedAST abt -> x
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: failwith :: TypeCheckError -> TypeCheckMonad r
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: failwith_ :: TypeCheckError -> TypeCheckMonad r
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: getCtx :: TypeCheckMonad Ctx
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: getHEq :: Sing a -> TypeCheckMonad (HEq a)
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: getHFractional :: Sing a -> TypeCheckMode -> TypeCheckMonad (SomeFractional a)
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: getHOrd :: Sing a -> TypeCheckMonad (HOrd a)
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: getHRing :: Sing a -> TypeCheckMode -> TypeCheckMonad (SomeRing a)
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: getHSemiring :: Sing a -> TypeCheckMonad (HSemiring a)
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: getInput :: TypeCheckMonad Input
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: getMode :: TypeCheckMonad TypeCheckMode
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: instance GHC.Base.Applicative Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad.TypeCheckMonad
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: instance GHC.Base.Functor Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad.TypeCheckMonad
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: instance GHC.Base.Monad Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad.TypeCheckMonad
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: instance GHC.Read.Read Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad.TypeCheckMode
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: instance GHC.Show.Show Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad.TypeCheckMode
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: instance Language.Hakaru.Syntax.ABT.ABT Language.Hakaru.Syntax.AST.Term abt => Language.Hakaru.Types.Coercion.Coerce (Language.Hakaru.Syntax.Datum.Branch a abt)
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: instance Language.Hakaru.Syntax.IClasses.Show2 abt => GHC.Show.Show (Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad.TypedAST abt)
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: isBool :: Sing a -> TypeCheckMonad (TypeEq a HBool)
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: jmEq1_ :: Sing (a :: Hakaru) -> Sing (b :: Hakaru) -> TypeCheckMonad (TypeEq a b)
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: lc :: (LC_ abt a -> LC_ abt b) -> abt '[] a -> abt '[] b
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: makeErrMsg :: Text -> Maybe SourceSpan -> Text -> TypeCheckMonad TypeCheckError
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: makeVar :: forall (a :: Hakaru). Variable 'U -> Sing a -> Variable a
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: make_NaryOp :: Sing a -> NaryOp -> TypeCheckMonad (NaryOp a)
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: missingInstance :: Text -> Sing (a :: Hakaru) -> Maybe SourceSpan -> TypeCheckMonad r
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: missingLub :: Sing (a :: Hakaru) -> Sing (b :: Hakaru) -> Maybe SourceSpan -> TypeCheckMonad r
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: newtype TypeCheckMonad a
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: onTypedAST :: (forall b. abt '[] b -> abt '[] b) -> TypedAST abt -> TypedAST abt
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: onTypedASTM :: (Functor m) => (forall b. abt '[] b -> m (abt '[] b)) -> TypedAST abt -> m (TypedAST abt)
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: pushCtx :: Variable (a :: Hakaru) -> TypeCheckMonad b -> TypeCheckMonad b
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: runTCM :: TypeCheckMonad a -> Input -> TypeCheckMode -> Either TypeCheckError a
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: try :: TypeCheckMonad a -> TypeCheckMonad (Maybe a)
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: tryWith :: TypeCheckMode -> TypeCheckMonad a -> TypeCheckMonad (Maybe a)
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: type Ctx = VarSet ( 'KProxy :: KProxy Hakaru)
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: type Input = Maybe (Vector Text)
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: type TypeCheckError = Text
+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad: typeMismatch :: Maybe SourceSpan -> Either Text (Sing (a :: Hakaru)) -> Either Text (Sing (b :: Hakaru)) -> TypeCheckMonad r
+ Language.Hakaru.Syntax.TypeCheck.Unification: class TCMTypeRepr x
+ Language.Hakaru.Syntax.TypeCheck.Unification: instance Language.Hakaru.Syntax.TypeCheck.Unification.TCMTypeRepr ()
+ Language.Hakaru.Syntax.TypeCheck.Unification: instance Language.Hakaru.Syntax.TypeCheck.Unification.TCMTypeRepr (Language.Hakaru.Types.Sing.Sing x)
+ Language.Hakaru.Syntax.TypeCheck.Unification: instance Language.Hakaru.Syntax.TypeCheck.Unification.TCMTypeRepr Data.Text.Internal.Text
+ Language.Hakaru.Syntax.TypeCheck.Unification: matchTypes :: (TCMTypeRepr t0, TCMTypeRepr t1) => Sing (x :: Hakaru) -> Sing y -> Metadata -> t0 -> t1 -> (x ~ y => TypeCheckMonad r) -> TypeCheckMonad r
+ Language.Hakaru.Syntax.TypeCheck.Unification: toTypeRepr :: TCMTypeRepr x => x -> Maybe (Either Text (Some1 (Sing :: Hakaru -> *)))
+ Language.Hakaru.Syntax.TypeCheck.Unification: type Metadata = Maybe SourceSpan
+ Language.Hakaru.Syntax.TypeCheck.Unification: type Unify2 (t :: Hakaru -> Hakaru -> Hakaru) r x = Sing x -> Metadata -> (forall a b. x ~ t a b => Sing a -> Sing b -> TypeCheckMonad r) -> TypeCheckMonad r
+ Language.Hakaru.Syntax.TypeCheck.Unification: unifyArray :: Unify1 'HArray r x
+ Language.Hakaru.Syntax.TypeCheck.Unification: unifyFun :: Unify2 '(:->) r x
+ Language.Hakaru.Syntax.TypeCheck.Unification: unifyMeasure :: Unify1 'HMeasure r x
+ Language.Hakaru.Syntax.TypeCheck.Unification: unifyPair :: Unify2 HPair r x
+ Language.Hakaru.Syntax.Variable: instance forall k (abt :: k -> *). GHC.Base.Monoid (Language.Hakaru.Syntax.Variable.Assocs abt)
+ Language.Hakaru.Syntax.Variable: instance forall k (abt :: k -> *). GHC.Base.Semigroup (Language.Hakaru.Syntax.Variable.Assocs abt)
+ Language.Hakaru.Syntax.Variable: instance forall k (ast :: k -> *). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 ast) => GHC.Show.Show (Language.Hakaru.Syntax.Variable.Assoc ast)
+ Language.Hakaru.Syntax.Variable: instance forall k (ast :: k -> *). (Language.Hakaru.Syntax.IClasses.Show1 Language.Hakaru.Types.Sing.Sing, Language.Hakaru.Syntax.IClasses.Show1 ast) => GHC.Show.Show (Language.Hakaru.Syntax.Variable.Assocs ast)
+ Language.Hakaru.Syntax.Variable: instance forall k (kproxy :: Data.Proxy.KProxy k). GHC.Base.Semigroup (Language.Hakaru.Syntax.Variable.VarSet kproxy)
+ Language.Hakaru.Types.Sing: sUnEither' :: Sing (x :: Hakaru) -> (forall (a :: Hakaru) (b :: Hakaru). (TypeEq x (HEither a b), Sing a, Sing b) -> r) -> Maybe r
+ Language.Hakaru.Types.Sing: sUnFun :: Sing (a :-> b) -> (Sing a, Sing b)
+ Language.Hakaru.Types.Sing: sUnPair' :: Sing (x :: Hakaru) -> (forall (a :: Hakaru) (b :: Hakaru). (TypeEq x (HPair a b), Sing a, Sing b) -> r) -> Maybe r
+ Language.Hakaru.Types.Sing: singOf :: SingI a => proxy a -> Sing a
- Language.Hakaru.CodeGen.AST: CDDeclrFun :: CDirectDeclr -> [CTypeSpec] -> CDirectDeclr
+ Language.Hakaru.CodeGen.AST: CDDeclrFun :: CDirectDeclr -> [[CTypeSpec]] -> CDirectDeclr
- Language.Hakaru.CodeGen.CodeGenMonad: CG :: [String] -> Set String -> [CExtDecl] -> [CDecl] -> [CStat] -> Env -> Bool -> Bool -> Bool -> Bool -> CG
+ Language.Hakaru.CodeGen.CodeGenMonad: CG :: [String] -> Set String -> [CExtDecl] -> [CDecl] -> [CStat] -> Env -> Bool -> Bool -> Bool -> Bool -> Bool -> CG
- Language.Hakaru.CodeGen.CodeGenMonad: funCG :: CTypeSpec -> Ident -> [CDecl] -> CodeGen () -> CodeGen ()
+ Language.Hakaru.CodeGen.CodeGenMonad: funCG :: [CTypeSpec] -> Ident -> [CDecl] -> CodeGen () -> CodeGen ()
- Language.Hakaru.CodeGen.CodeGenMonad: reductionCG :: Either CBinaryOp (CExpr -> CExpr -> CExpr) -> Ident -> CExpr -> CExpr -> CExpr -> CodeGen () -> CodeGen ()
+ Language.Hakaru.CodeGen.CodeGenMonad: reductionCG :: Either CBinaryOp (Sing (a :: Hakaru), CExpr -> CodeGen (), CExpr -> CExpr -> CodeGen ()) -> CExpr -> CExpr -> CExpr -> CExpr -> CodeGen () -> CodeGen ()
- Language.Hakaru.CodeGen.Pretty: class Pretty a where pretty = prettyPrec 0 prettyPrec _ = pretty
+ Language.Hakaru.CodeGen.Pretty: class Pretty a
- Language.Hakaru.Command: parseAndInfer' :: Text -> IO (Either Text (TypedAST (TrivialABT Term)))
+ Language.Hakaru.Command: parseAndInfer' :: Source -> IO (Either Text (TypedAST (TrivialABT Term)))
- Language.Hakaru.Disintegrate: constrainOutcome :: forall abt a. (ABT Term abt) => abt '[] a -> abt '[] (HMeasure a) -> Dis abt ()
+ Language.Hakaru.Disintegrate: constrainOutcome :: forall abt a. (ABT Term abt) => abt '[] a -> abt '[] ( 'HMeasure a) -> Dis abt ()
- Language.Hakaru.Disintegrate: density :: (ABT Term abt) => abt '[] (HMeasure a) -> [abt '[] (a :-> HProb)]
+ Language.Hakaru.Disintegrate: density :: (ABT Term abt) => abt '[] ( 'HMeasure a) -> [abt '[] (a :-> 'HProb)]
- Language.Hakaru.Disintegrate: densityWithVar :: (ABT Term abt) => Text -> Sing a -> abt '[] (HMeasure a) -> [abt '[] (a :-> HProb)]
+ Language.Hakaru.Disintegrate: densityWithVar :: (ABT Term abt) => TransformCtx -> Text -> Sing a -> abt '[] ( 'HMeasure a) -> [abt '[] (a :-> 'HProb)]
- Language.Hakaru.Disintegrate: disintegrate :: (ABT Term abt) => abt '[] (HMeasure (HPair a b)) -> [abt '[] (a :-> HMeasure b)]
+ Language.Hakaru.Disintegrate: disintegrate :: (ABT Term abt) => abt '[] ( 'HMeasure (HPair a b)) -> [abt '[] (a :-> 'HMeasure b)]
- Language.Hakaru.Disintegrate: disintegrateWithVar :: (ABT Term abt) => Text -> Sing a -> abt '[] (HMeasure (HPair a b)) -> [abt '[] (a :-> HMeasure b)]
+ Language.Hakaru.Disintegrate: disintegrateWithVar :: (ABT Term abt) => TransformCtx -> Text -> Sing a -> abt '[] ( 'HMeasure (HPair a b)) -> [abt '[] (a :-> 'HMeasure b)]
- Language.Hakaru.Disintegrate: observe :: (ABT Term abt) => abt '[] (HMeasure a) -> abt '[] a -> [abt '[] (HMeasure a)]
+ Language.Hakaru.Disintegrate: observe :: (ABT Term abt) => abt '[] ( 'HMeasure a) -> abt '[] a -> [abt '[] ( 'HMeasure a)]
- Language.Hakaru.Evaluation.DisintegrationMonad: Dis :: (forall a. [Index (abt '[])] -> (x -> Ans abt a) -> Ans abt a) -> Dis abt x
+ Language.Hakaru.Evaluation.DisintegrationMonad: Dis :: forall a. [Index (abt '[])] -> (x -> Ans abt a) -> Ans abt a -> Dis abt x
- Language.Hakaru.Evaluation.DisintegrationMonad: [Loc] :: Location a -> [ast HNat] -> Extra ast a
+ Language.Hakaru.Evaluation.DisintegrationMonad: [Loc] :: Location a -> [ast 'HNat] -> Extra ast a
- Language.Hakaru.Evaluation.DisintegrationMonad: emit :: (ABT Term abt) => Text -> Sing a -> (forall r. abt '[a] (HMeasure r) -> abt '[] (HMeasure r)) -> Dis abt (Variable a)
+ Language.Hakaru.Evaluation.DisintegrationMonad: emit :: (ABT Term abt) => Text -> Sing a -> (forall r. abt '[a] ( 'HMeasure r) -> abt '[] ( 'HMeasure r)) -> Dis abt (Variable a)
- Language.Hakaru.Evaluation.DisintegrationMonad: emitFork_ :: (ABT Term abt, Traversable t) => (forall r. t (abt '[] (HMeasure r)) -> abt '[] (HMeasure r)) -> t (Dis abt a) -> Dis abt a
+ Language.Hakaru.Evaluation.DisintegrationMonad: emitFork_ :: (ABT Term abt, Traversable t) => (forall r. t (abt '[] ( 'HMeasure r)) -> abt '[] ( 'HMeasure r)) -> t (Dis abt a) -> Dis abt a
- Language.Hakaru.Evaluation.DisintegrationMonad: emitMBind :: (ABT Term abt) => abt '[] (HMeasure a) -> Dis abt (Variable a)
+ Language.Hakaru.Evaluation.DisintegrationMonad: emitMBind :: (ABT Term abt) => abt '[] ( 'HMeasure a) -> Dis abt (Variable a)
- Language.Hakaru.Evaluation.DisintegrationMonad: emitMBind2 :: (ABT Term abt) => abt '[] (HMeasure a) -> Dis abt (abt '[] a)
+ Language.Hakaru.Evaluation.DisintegrationMonad: emitMBind2 :: (ABT Term abt) => abt '[] ( 'HMeasure a) -> Dis abt (abt '[] a)
- Language.Hakaru.Evaluation.DisintegrationMonad: emitMBind_ :: (ABT Term abt) => abt '[] (HMeasure HUnit) -> Dis abt ()
+ Language.Hakaru.Evaluation.DisintegrationMonad: emitMBind_ :: (ABT Term abt) => abt '[] ( 'HMeasure HUnit) -> Dis abt ()
- Language.Hakaru.Evaluation.DisintegrationMonad: emitSuperpose :: (ABT Term abt) => [abt '[] (HMeasure a)] -> Dis abt (Variable a)
+ Language.Hakaru.Evaluation.DisintegrationMonad: emitSuperpose :: (ABT Term abt) => [abt '[] ( 'HMeasure a)] -> Dis abt (Variable a)
- Language.Hakaru.Evaluation.DisintegrationMonad: emitWeight :: (ABT Term abt) => abt '[] HProb -> Dis abt ()
+ Language.Hakaru.Evaluation.DisintegrationMonad: emitWeight :: (ABT Term abt) => abt '[] 'HProb -> Dis abt ()
- Language.Hakaru.Evaluation.DisintegrationMonad: emit_ :: (ABT Term abt) => (forall r. abt '[] (HMeasure r) -> abt '[] (HMeasure r)) -> Dis abt ()
+ Language.Hakaru.Evaluation.DisintegrationMonad: emit_ :: (ABT Term abt) => (forall r. abt '[] ( 'HMeasure r) -> abt '[] ( 'HMeasure r)) -> Dis abt ()
- Language.Hakaru.Evaluation.DisintegrationMonad: getStatements :: Dis abt [Statement abt Location Impure]
+ Language.Hakaru.Evaluation.DisintegrationMonad: getStatements :: Dis abt [Statement abt Location 'Impure]
- Language.Hakaru.Evaluation.DisintegrationMonad: mkLoc :: (ABT Term abt) => Text -> Location (a :: Hakaru) -> [abt '[] HNat] -> Dis abt (Variable a)
+ Language.Hakaru.Evaluation.DisintegrationMonad: mkLoc :: (ABT Term abt) => Text -> Location (a :: Hakaru) -> [abt '[] 'HNat] -> Dis abt (Variable a)
- Language.Hakaru.Evaluation.DisintegrationMonad: permutes :: (ABT Term abt) => [abt '[] HNat] -> [Index (abt '[])] -> Bool
+ Language.Hakaru.Evaluation.DisintegrationMonad: permutes :: (ABT Term abt) => [abt '[] 'HNat] -> [Index (abt '[])] -> Bool
- Language.Hakaru.Evaluation.DisintegrationMonad: pushPlate :: (ABT Term abt) => abt '[] HNat -> abt '[HNat] (HMeasure a) -> Dis abt (abt '[] (HArray a))
+ Language.Hakaru.Evaluation.DisintegrationMonad: pushPlate :: (ABT Term abt) => abt '[] 'HNat -> abt '[ 'HNat] ( 'HMeasure a) -> Dis abt (abt '[] ( 'HArray a))
- Language.Hakaru.Evaluation.DisintegrationMonad: pushWeight :: (ABT Term abt) => abt '[] HProb -> Dis abt ()
+ Language.Hakaru.Evaluation.DisintegrationMonad: pushWeight :: (ABT Term abt) => abt '[] 'HProb -> Dis abt ()
- Language.Hakaru.Evaluation.DisintegrationMonad: putStatements :: [Statement abt Location Impure] -> Dis abt ()
+ Language.Hakaru.Evaluation.DisintegrationMonad: putStatements :: [Statement abt Location 'Impure] -> Dis abt ()
- Language.Hakaru.Evaluation.DisintegrationMonad: runDis :: (ABT Term abt, Foldable f) => Dis abt (abt '[] a) -> f (Some2 abt) -> [abt '[] (HMeasure a)]
+ Language.Hakaru.Evaluation.DisintegrationMonad: runDis :: (ABT Term abt, Foldable f) => Dis abt (abt '[] a) -> f (Some2 abt) -> [abt '[] ( 'HMeasure a)]
- Language.Hakaru.Evaluation.DisintegrationMonad: selectMore :: [ast HNat] -> ast HNat -> [ast HNat]
+ Language.Hakaru.Evaluation.DisintegrationMonad: selectMore :: [ast 'HNat] -> ast 'HNat -> [ast 'HNat]
- Language.Hakaru.Evaluation.DisintegrationMonad: sizeInnermostInd :: (ABT Term abt) => Location (a :: Hakaru) -> Dis abt (abt '[] HNat)
+ Language.Hakaru.Evaluation.DisintegrationMonad: sizeInnermostInd :: (ABT Term abt) => Location (a :: Hakaru) -> Dis abt (abt '[] 'HNat)
- Language.Hakaru.Evaluation.DisintegrationMonad: type Ans abt a = ListContext abt Impure -> Assocs (Extra (abt '[])) -> [abt '[] (HMeasure a)]
+ Language.Hakaru.Evaluation.DisintegrationMonad: type Ans abt a = ListContext abt 'Impure -> Assocs (Extra (abt '[])) -> [abt '[] ( 'HMeasure a)]
- Language.Hakaru.Evaluation.DisintegrationMonad: zipInds :: (ABT Term abt) => [Index (abt '[])] -> [abt '[] HNat] -> Assocs (abt '[])
+ Language.Hakaru.Evaluation.DisintegrationMonad: zipInds :: (ABT Term abt) => [Index (abt '[])] -> [abt '[] 'HNat] -> Assocs (abt '[])
- Language.Hakaru.Evaluation.EvalMonad: Eval :: (forall a. (x -> PureAns abt a) -> PureAns abt a) -> Eval abt x
+ Language.Hakaru.Evaluation.EvalMonad: Eval :: forall a. (x -> PureAns abt a) -> PureAns abt a -> Eval abt x
- Language.Hakaru.Evaluation.EvalMonad: residualizePureListContext :: forall abt a. (ABT Term abt) => abt '[] a -> ListContext abt Pure -> abt '[] a
+ Language.Hakaru.Evaluation.EvalMonad: residualizePureListContext :: forall abt a. (ABT Term abt) => abt '[] a -> ListContext abt 'Pure -> abt '[] a
- Language.Hakaru.Evaluation.EvalMonad: type PureAns abt a = ListContext abt Pure -> abt '[] a
+ Language.Hakaru.Evaluation.EvalMonad: type PureAns abt a = ListContext abt 'Pure -> abt '[] a
- Language.Hakaru.Evaluation.ExpectMonad: Expect :: ((x -> ExpectAns abt) -> ExpectAns abt) -> Expect abt x
+ Language.Hakaru.Evaluation.ExpectMonad: Expect :: (x -> ExpectAns abt) -> ExpectAns abt -> Expect abt x
- Language.Hakaru.Evaluation.ExpectMonad: emit :: (ABT Term abt) => Text -> Sing a -> (abt '[a] HProb -> abt '[] HProb) -> Expect abt (Variable a)
+ Language.Hakaru.Evaluation.ExpectMonad: emit :: (ABT Term abt) => Text -> Sing a -> (abt '[a] 'HProb -> abt '[] 'HProb) -> Expect abt (Variable a)
- Language.Hakaru.Evaluation.ExpectMonad: emit_ :: (ABT Term abt) => (abt '[] HProb -> abt '[] HProb) -> Expect abt ()
+ Language.Hakaru.Evaluation.ExpectMonad: emit_ :: (ABT Term abt) => (abt '[] 'HProb -> abt '[] 'HProb) -> Expect abt ()
- Language.Hakaru.Evaluation.ExpectMonad: residualizeExpectListContext :: forall abt. (ABT Term abt) => abt '[] HProb -> ListContext abt ExpectP -> abt '[] HProb
+ Language.Hakaru.Evaluation.ExpectMonad: residualizeExpectListContext :: forall abt. (ABT Term abt) => abt '[] 'HProb -> ListContext abt 'ExpectP -> abt '[] 'HProb
- Language.Hakaru.Evaluation.ExpectMonad: runExpect :: forall abt f a. (ABT Term abt, Foldable f) => Expect abt (abt '[] a) -> abt '[a] HProb -> f (Some2 abt) -> abt '[] HProb
+ Language.Hakaru.Evaluation.ExpectMonad: runExpect :: forall abt f a. (ABT Term abt, Foldable f) => Expect abt (abt '[] a) -> TransformCtx -> abt '[a] 'HProb -> f (Some2 abt) -> abt '[] 'HProb
- Language.Hakaru.Evaluation.ExpectMonad: type ExpectAns abt = ListContext abt ExpectP -> abt '[] HProb
+ Language.Hakaru.Evaluation.ExpectMonad: type ExpectAns abt = ListContext abt 'ExpectP -> abt '[] 'HProb
- Language.Hakaru.Evaluation.Lazy: reflect :: (Interp a a', ABT Term abt) => a' -> Head abt a
+ Language.Hakaru.Evaluation.Lazy: reflect :: (Interp a a', (ABT Term abt)) => a' -> Head abt a
- Language.Hakaru.Evaluation.Lazy: reify :: (Interp a a', ABT Term abt) => Head abt a -> a'
+ Language.Hakaru.Evaluation.Lazy: reify :: (Interp a a', (ABT Term abt)) => Head abt a -> a'
- Language.Hakaru.Evaluation.PEvalMonad: PEval :: (forall a. (x -> PAns p abt m a) -> PAns p abt m a) -> PEval abt p m x
+ Language.Hakaru.Evaluation.PEvalMonad: PEval :: forall a. (x -> PAns p abt m a) -> PAns p abt m a -> PEval abt p m x
- Language.Hakaru.Evaluation.PEvalMonad: choose :: (ABT Term abt, Applicative m) => [PEval abt Impure m a] -> PEval abt Impure m a
+ Language.Hakaru.Evaluation.PEvalMonad: choose :: (ABT Term abt, Applicative m) => [PEval abt 'Impure m a] -> PEval abt 'Impure m a
- Language.Hakaru.Evaluation.PEvalMonad: emitGuard :: (ABT Term abt, Functor m) => abt '[] HBool -> PEval abt Impure m ()
+ Language.Hakaru.Evaluation.PEvalMonad: emitGuard :: (ABT Term abt, Functor m) => abt '[] HBool -> PEval abt 'Impure m ()
- Language.Hakaru.Evaluation.PEvalMonad: emitMBind :: (ABT Term abt, Functor m) => abt '[] (HMeasure a) -> PEval abt Impure m (Variable a)
+ Language.Hakaru.Evaluation.PEvalMonad: emitMBind :: (ABT Term abt, Functor m) => abt '[] ( 'HMeasure a) -> PEval abt 'Impure m (Variable a)
- Language.Hakaru.Evaluation.PEvalMonad: emitMBind_ :: (ABT Term abt, Functor m) => abt '[] (HMeasure HUnit) -> PEval abt Impure m ()
+ Language.Hakaru.Evaluation.PEvalMonad: emitMBind_ :: (ABT Term abt, Functor m) => abt '[] ( 'HMeasure HUnit) -> PEval abt 'Impure m ()
- Language.Hakaru.Evaluation.PEvalMonad: emitSuperpose :: (ABT Term abt, Functor m) => [abt '[] (HMeasure a)] -> PEval abt Impure m (Variable a)
+ Language.Hakaru.Evaluation.PEvalMonad: emitSuperpose :: (ABT Term abt, Functor m) => [abt '[] ( 'HMeasure a)] -> PEval abt 'Impure m (Variable a)
- Language.Hakaru.Evaluation.PEvalMonad: emitWeight :: (ABT Term abt, Functor m) => abt '[] HProb -> PEval abt Impure m ()
+ Language.Hakaru.Evaluation.PEvalMonad: emitWeight :: (ABT Term abt, Functor m) => abt '[] 'HProb -> PEval abt 'Impure m ()
- Language.Hakaru.Evaluation.PEvalMonad: runExpectEval :: (ABT Term abt, Applicative m, Foldable f) => PEval abt ExpectP m (abt '[] a) -> abt '[a] HProb -> f (Some2 abt) -> m (abt '[] HProb)
+ Language.Hakaru.Evaluation.PEvalMonad: runExpectEval :: (ABT Term abt, Applicative m, Foldable f) => PEval abt 'ExpectP m (abt '[] a) -> abt '[a] 'HProb -> f (Some2 abt) -> m (abt '[] 'HProb)
- Language.Hakaru.Evaluation.PEvalMonad: runImpureEval :: (ABT Term abt, Applicative m, Foldable f) => PEval abt Impure m (abt '[] a) -> f (Some2 abt) -> m (abt '[] (HMeasure a))
+ Language.Hakaru.Evaluation.PEvalMonad: runImpureEval :: (ABT Term abt, Applicative m, Foldable f) => PEval abt 'Impure m (abt '[] a) -> f (Some2 abt) -> m (abt '[] ( 'HMeasure a))
- Language.Hakaru.Evaluation.PEvalMonad: runPureEval :: (ABT Term abt, Applicative m, Foldable f) => PEval abt Pure m (abt '[] a) -> f (Some2 abt) -> m (abt '[] a)
+ Language.Hakaru.Evaluation.PEvalMonad: runPureEval :: (ABT Term abt, Applicative m, Foldable f) => PEval abt 'Pure m (abt '[] a) -> f (Some2 abt) -> m (abt '[] a)
- Language.Hakaru.Evaluation.Types: [SBind] :: forall abt (v :: Hakaru -> *) (a :: Hakaru). {-# UNPACK #-} !(v a) -> !(Lazy abt (HMeasure a)) -> [Index (abt '[])] -> Statement abt v Impure
+ Language.Hakaru.Evaluation.Types: [SBind] :: forall abt (v :: Hakaru -> *) (a :: Hakaru). {-# UNPACK #-} !(v a) -> !(Lazy abt ( 'HMeasure a)) -> [Index (abt '[])] -> Statement abt v 'Impure
- Language.Hakaru.Evaluation.Types: [SGuard] :: forall abt (v :: Hakaru -> *) (xs :: [Hakaru]) (a :: Hakaru). !(List1 v xs) -> !(Pattern xs a) -> !(Lazy abt a) -> [Index (abt '[])] -> Statement abt v Impure
+ Language.Hakaru.Evaluation.Types: [SGuard] :: forall abt (v :: Hakaru -> *) (xs :: [Hakaru]) (a :: Hakaru). !(List1 v xs) -> !(Pattern xs a) -> !(Lazy abt a) -> [Index (abt '[])] -> Statement abt v 'Impure
- Language.Hakaru.Evaluation.Types: [SStuff0] :: forall abt (v :: Hakaru -> *). (abt '[] HProb -> abt '[] HProb) -> [Index (abt '[])] -> Statement abt v ExpectP
+ Language.Hakaru.Evaluation.Types: [SStuff0] :: forall abt (v :: Hakaru -> *). (abt '[] 'HProb -> abt '[] 'HProb) -> [Index (abt '[])] -> Statement abt v 'ExpectP
- Language.Hakaru.Evaluation.Types: [SStuff1] :: forall abt (v :: Hakaru -> *) (a :: Hakaru). {-# UNPACK #-} !(v a) -> (abt '[] HProb -> abt '[] HProb) -> [Index (abt '[])] -> Statement abt v ExpectP
+ Language.Hakaru.Evaluation.Types: [SStuff1] :: forall abt (v :: Hakaru -> *) (a :: Hakaru). {-# UNPACK #-} !(v a) -> (abt '[] 'HProb -> abt '[] 'HProb) -> [Index (abt '[])] -> Statement abt v 'ExpectP
- Language.Hakaru.Evaluation.Types: [SWeight] :: forall abt (v :: Hakaru -> *). !(Lazy abt HProb) -> [Index (abt '[])] -> Statement abt v Impure
+ Language.Hakaru.Evaluation.Types: [SWeight] :: forall abt (v :: Hakaru -> *). !(Lazy abt 'HProb) -> [Index (abt '[])] -> Statement abt v 'Impure
- Language.Hakaru.Evaluation.Types: [WArrayLiteral] :: [abt '[] a] -> Head abt (HArray a)
+ Language.Hakaru.Evaluation.Types: [WArrayLiteral] :: [abt '[] a] -> Head abt ( 'HArray a)
- Language.Hakaru.Evaluation.Types: [WArray] :: !(abt '[] HNat) -> !(abt '[HNat] a) -> Head abt (HArray a)
+ Language.Hakaru.Evaluation.Types: [WArray] :: !(abt '[] 'HNat) -> !(abt '[ 'HNat] a) -> Head abt ( 'HArray a)
- Language.Hakaru.Evaluation.Types: [WChain] :: !(abt '[] HNat) -> !(abt '[] s) -> !(abt '[s] (HMeasure (HPair a s))) -> Head abt (HMeasure (HPair (HArray a) s))
+ Language.Hakaru.Evaluation.Types: [WChain] :: !(abt '[] 'HNat) -> !(abt '[] s) -> !(abt '[s] ( 'HMeasure (HPair a s))) -> Head abt ( 'HMeasure (HPair ( 'HArray a) s))
- Language.Hakaru.Evaluation.Types: [WDirac] :: !(abt '[] a) -> Head abt (HMeasure a)
+ Language.Hakaru.Evaluation.Types: [WDirac] :: !(abt '[] a) -> Head abt ( 'HMeasure a)
- Language.Hakaru.Evaluation.Types: [WEmpty] :: !(Sing (HArray a)) -> Head abt (HArray a)
+ Language.Hakaru.Evaluation.Types: [WEmpty] :: !(Sing ( 'HArray a)) -> Head abt ( 'HArray a)
- Language.Hakaru.Evaluation.Types: [WIntegrate] :: !(abt '[] HReal) -> !(abt '[] HReal) -> !(abt '[HReal] HProb) -> Head abt HProb
+ Language.Hakaru.Evaluation.Types: [WIntegrate] :: !(abt '[] 'HReal) -> !(abt '[] 'HReal) -> !(abt '[ 'HReal] 'HProb) -> Head abt 'HProb
- Language.Hakaru.Evaluation.Types: [WMBind] :: !(abt '[] (HMeasure a)) -> !(abt '[a] (HMeasure b)) -> Head abt (HMeasure b)
+ Language.Hakaru.Evaluation.Types: [WMBind] :: !(abt '[] ( 'HMeasure a)) -> !(abt '[a] ( 'HMeasure b)) -> Head abt ( 'HMeasure b)
- Language.Hakaru.Evaluation.Types: [WMeasureOp] :: (typs ~ UnLCs args, args ~ LCs typs) => !(MeasureOp typs a) -> !(SArgs abt args) -> Head abt (HMeasure a)
+ Language.Hakaru.Evaluation.Types: [WMeasureOp] :: (typs ~ UnLCs args, args ~ LCs typs) => !(MeasureOp typs a) -> !(SArgs abt args) -> Head abt ( 'HMeasure a)
- Language.Hakaru.Evaluation.Types: [WPlate] :: !(abt '[] HNat) -> !(abt '[HNat] (HMeasure a)) -> Head abt (HMeasure (HArray a))
+ Language.Hakaru.Evaluation.Types: [WPlate] :: !(abt '[] 'HNat) -> !(abt '[ 'HNat] ( 'HMeasure a)) -> Head abt ( 'HMeasure ( 'HArray a))
- Language.Hakaru.Evaluation.Types: [WReject] :: !(Sing (HMeasure a)) -> Head abt (HMeasure a)
+ Language.Hakaru.Evaluation.Types: [WReject] :: !(Sing ( 'HMeasure a)) -> Head abt ( 'HMeasure a)
- Language.Hakaru.Evaluation.Types: [WSuperpose] :: !(NonEmpty (abt '[] HProb, abt '[] (HMeasure a))) -> Head abt (HMeasure a)
+ Language.Hakaru.Evaluation.Types: [WSuperpose] :: !(NonEmpty (abt '[] 'HProb, abt '[] ( 'HMeasure a))) -> Head abt ( 'HMeasure a)
- Language.Hakaru.Evaluation.Types: class (Functor m, Applicative m, Monad m, ABT Term abt) => EvaluationMonad abt m p | m -> abt p where freshLocStatement s = case s of { SWeight w e -> return (SWeight w e, mempty) SBind x body i -> do { x' <- freshenVar x; return (SBind (Location x') body i, singletonAssocs x x') } SLet x body i -> do { x' <- freshenVar x; return (SLet (Location x') body i, singletonAssocs x x') } SGuard xs pat scrutinee i -> do { xs' <- freshenVars xs; return (SGuard (locations1 xs') pat scrutinee i, toAssocs1 xs xs') } SStuff0 e e' -> return (SStuff0 e e', mempty) SStuff1 x f i -> do { x' <- freshenVar x; return (SStuff1 (Location x') f i, singletonAssocs x x') } } getIndices = return [] unsafePushes = mapM_ unsafePush substVar x e = return . var extFreeVars e = return (freeVars e) evaluateCase = defaultCaseEvaluator evaluateVar perform evaluate_ = \ x -> fmap (maybe (Neutral $ var x) id) . select (Location x) $ \ s -> case s of { SBind y e i -> do { Refl <- locEq (Location x) y; Just $ do { w <- perform $ caseLazy e fromWhnf id; unsafePush (SLet (Location x) (Whnf_ w) i); return w } } SLet y e i -> do { Refl <- locEq (Location x) y; Just $ do { w <- caseLazy e return evaluate_; unsafePush (SLet (Location x) (Whnf_ w) i); return w } } SWeight _ _ -> Nothing SStuff0 _ _ -> Nothing SStuff1 _ _ _ -> Just . return . Neutral $ var x SGuard ys pat scrutinee i -> Just . return . Neutral $ var x }
+ Language.Hakaru.Evaluation.Types: class (Functor m, Applicative m, Monad m, ABT Term abt) => EvaluationMonad abt m p | m -> abt p
- Language.Hakaru.Evaluation.Types: freshInd :: (EvaluationMonad abt m p) => abt '[] HNat -> m (Index (abt '[]))
+ Language.Hakaru.Evaluation.Types: freshInd :: (EvaluationMonad abt m p) => abt '[] 'HNat -> m (Index (abt '[]))
- Language.Hakaru.Evaluation.Types: fromIndex :: (ABT Term abt) => Index (abt '[]) -> abt '[] HNat
+ Language.Hakaru.Evaluation.Types: fromIndex :: (ABT Term abt) => Index (abt '[]) -> abt '[] 'HNat
- Language.Hakaru.Evaluation.Types: indSize :: Index ast -> ast HNat
+ Language.Hakaru.Evaluation.Types: indSize :: Index ast -> ast 'HNat
- Language.Hakaru.Evaluation.Types: indVar :: Index ast -> Variable HNat
+ Language.Hakaru.Evaluation.Types: indVar :: Index ast -> Variable 'HNat
- Language.Hakaru.Evaluation.Types: statementVars :: Statement abt Location p -> VarSet (KProxy :: KProxy Hakaru)
+ Language.Hakaru.Evaluation.Types: statementVars :: Statement abt Location p -> VarSet ( 'KProxy :: KProxy Hakaru)
- Language.Hakaru.Evaluation.Types: type MeasureEvaluator abt m = forall a. abt '[] (HMeasure a) -> m (Whnf abt a)
+ Language.Hakaru.Evaluation.Types: type MeasureEvaluator abt m = forall a. abt '[] ( 'HMeasure a) -> m (Whnf abt a)
- Language.Hakaru.Expect: expect :: (ABT Term abt) => abt '[] (HMeasure a) -> abt '[a] HProb -> abt '[] HProb
+ Language.Hakaru.Expect: expect :: (ABT Term abt) => abt '[] ( 'HMeasure a) -> abt '[a] 'HProb -> abt '[] 'HProb
- Language.Hakaru.Expect: normalize :: (ABT Term abt) => abt '[] (HMeasure a) -> abt '[] (HMeasure a)
+ Language.Hakaru.Expect: normalize :: (ABT Term abt) => abt '[] ( 'HMeasure a) -> abt '[] ( 'HMeasure a)
- Language.Hakaru.Expect: total :: (ABT Term abt) => abt '[] (HMeasure a) -> abt '[] HProb
+ Language.Hakaru.Expect: total :: (ABT Term abt) => abt '[] ( 'HMeasure a) -> abt '[] 'HProb
- Language.Hakaru.Inference: approxMh :: (ABT Term abt, SingI a) => (abt '[] a -> abt '[] (HMeasure a)) -> abt '[] (HMeasure a) -> [abt '[] a -> abt '[] (HMeasure a)] -> abt '[] (a :-> HMeasure a)
+ Language.Hakaru.Inference: approxMh :: (ABT Term abt, SingI a) => (abt '[] a -> abt '[] ( 'HMeasure a)) -> abt '[] ( 'HMeasure a) -> [abt '[] a -> abt '[] ( 'HMeasure a)] -> abt '[] (a :-> 'HMeasure a)
- Language.Hakaru.Inference: gibbsProposal :: (ABT Term abt, SingI a, SingI b) => abt '[] (HMeasure (HPair a b)) -> abt '[] (HPair a b) -> abt '[] (HMeasure (HPair a b))
+ Language.Hakaru.Inference: gibbsProposal :: (ABT Term abt, SingI a, SingI b) => abt '[] ( 'HMeasure (HPair a b)) -> abt '[] (HPair a b) -> abt '[] ( 'HMeasure (HPair a b))
- Language.Hakaru.Inference: incompleteBeta :: (ABT Term abt) => abt '[] HProb -> abt '[] HProb -> abt '[] HProb -> abt '[] HProb
+ Language.Hakaru.Inference: incompleteBeta :: (ABT Term abt) => abt '[] 'HProb -> abt '[] 'HProb -> abt '[] 'HProb -> abt '[] 'HProb
- Language.Hakaru.Inference: kl :: (ABT Term abt) => abt '[] (HMeasure a) -> abt '[] (HMeasure a) -> Maybe (abt '[] HProb)
+ Language.Hakaru.Inference: kl :: (ABT Term abt) => abt '[] ( 'HMeasure a) -> abt '[] ( 'HMeasure a) -> Maybe (abt '[] 'HProb)
- Language.Hakaru.Inference: mcmc :: (ABT Term abt) => abt '[] (a :-> HMeasure a) -> abt '[] (HMeasure a) -> abt '[] (a :-> HMeasure a)
+ Language.Hakaru.Inference: mcmc :: (ABT Term abt) => abt '[] (a :-> 'HMeasure a) -> abt '[] ( 'HMeasure a) -> abt '[] (a :-> 'HMeasure a)
- Language.Hakaru.Inference: mh :: (ABT Term abt) => abt '[] (a :-> HMeasure a) -> abt '[] (HMeasure a) -> abt '[] (a :-> HMeasure (HPair a HProb))
+ Language.Hakaru.Inference: mh :: (ABT Term abt) => abt '[] (a :-> 'HMeasure a) -> abt '[] ( 'HMeasure a) -> abt '[] (a :-> 'HMeasure (HPair a 'HProb))
- Language.Hakaru.Inference: priorAsProposal :: (ABT Term abt, SingI a, SingI b) => abt '[] (HMeasure (HPair a b)) -> abt '[] (HPair a b) -> abt '[] (HMeasure (HPair a b))
+ Language.Hakaru.Inference: priorAsProposal :: (ABT Term abt, SingI a, SingI b) => abt '[] ( 'HMeasure (HPair a b)) -> abt '[] (HPair a b) -> abt '[] ( 'HMeasure (HPair a b))
- Language.Hakaru.Inference: regBeta :: (ABT Term abt) => abt '[] HProb -> abt '[] HProb -> abt '[] HProb -> abt '[] HProb
+ Language.Hakaru.Inference: regBeta :: (ABT Term abt) => abt '[] 'HProb -> abt '[] 'HProb -> abt '[] 'HProb -> abt '[] 'HProb
- Language.Hakaru.Inference: slice :: (ABT Term abt) => abt '[] (HMeasure HReal) -> abt '[] (HReal :-> HMeasure HReal)
+ Language.Hakaru.Inference: slice :: (ABT Term abt) => abt '[] ( 'HMeasure 'HReal) -> abt '[] ( 'HReal :-> 'HMeasure 'HReal)
- Language.Hakaru.Inference: sliceX :: (ABT Term abt, SingI a) => abt '[] (HMeasure a) -> abt '[] (HMeasure (HPair a HReal))
+ Language.Hakaru.Inference: sliceX :: (ABT Term abt, SingI a) => abt '[] ( 'HMeasure a) -> abt '[] ( 'HMeasure (HPair a 'HReal))
- Language.Hakaru.Inference: tCDF :: (ABT Term abt) => abt '[] HReal -> abt '[] HProb -> abt '[] HProb
+ Language.Hakaru.Inference: tCDF :: (ABT Term abt) => abt '[] 'HReal -> abt '[] 'HProb -> abt '[] 'HProb
- Language.Hakaru.Maple: MapleOptions :: nm -> Bool -> Int -> Map String String -> MapleOptions nm
+ Language.Hakaru.Maple: MapleOptions :: nm -> Bool -> Int -> Map String String -> TransformCtx -> MapleOptions nm
- Language.Hakaru.Maple: sendToMaple :: (ABT Term abt) => MapleOptions (CommandType c i o) -> abt '[] i -> IO (abt '[] o)
+ Language.Hakaru.Maple: sendToMaple :: (ABT Term abt) => MapleOptions (MapleCommand i o) -> abt '[] i -> IO (abt '[] o)
- Language.Hakaru.Observe: observe :: (ABT Term abt) => abt '[] (HMeasure a) -> abt '[] a -> abt '[] (HMeasure a)
+ Language.Hakaru.Observe: observe :: (ABT Term abt) => abt '[] ( 'HMeasure a) -> abt '[] a -> abt '[] ( 'HMeasure a)
- Language.Hakaru.Observe: observeAST :: (ABT Term abt) => LC_ abt (HMeasure a) -> LC_ abt a -> abt '[] (HMeasure a)
+ Language.Hakaru.Observe: observeAST :: (ABT Term abt) => LC_ abt ( 'HMeasure a) -> LC_ abt a -> abt '[] ( 'HMeasure a)
- Language.Hakaru.Observe: observeMeasureOp :: (ABT Term abt, typs ~ UnLCs args, args ~ LCs typs) => MeasureOp typs a -> SArgs abt args -> abt '[] a -> abt '[] (HMeasure a)
+ Language.Hakaru.Observe: observeMeasureOp :: (ABT Term abt, typs ~ UnLCs args, args ~ LCs typs) => MeasureOp typs a -> SArgs abt args -> abt '[] a -> abt '[] ( 'HMeasure a)
- Language.Hakaru.Parser.AST: Branch_ :: Pattern -> (abt '[] U) -> Branch_ abt
+ Language.Hakaru.Parser.AST: Branch_ :: Pattern -> (abt '[] 'U) -> Branch_ abt
- Language.Hakaru.Parser.AST: Expect :: a -> (AST' a) -> (AST' a) -> AST' a
+ Language.Hakaru.Parser.AST: Expect :: Transform'
- Language.Hakaru.Parser.AST: Ident :: (abt '[] U) -> DFun abt
+ Language.Hakaru.Parser.AST: Ident :: (abt '[] 'U) -> DFun abt
- Language.Hakaru.Parser.AST: Konst :: (abt '[] U) -> DFun abt
+ Language.Hakaru.Parser.AST: Konst :: (abt '[] 'U) -> DFun abt
- Language.Hakaru.Parser.AST: Observe :: (AST' a) -> (AST' a) -> AST' a
+ Language.Hakaru.Parser.AST: Observe :: Transform'
- Language.Hakaru.Parser.AST: [Ann_] :: SSing -> abt '[] U -> Term abt U
+ Language.Hakaru.Parser.AST: [Ann_] :: SSing -> abt '[] 'U -> Term abt 'U
- Language.Hakaru.Parser.AST: [App_] :: abt '[] U -> abt '[] U -> Term abt U
+ Language.Hakaru.Parser.AST: [App_] :: abt '[] 'U -> abt '[] 'U -> Term abt 'U
- Language.Hakaru.Parser.AST: [ArrayLiteral_] :: [abt '[] U] -> Term abt U
+ Language.Hakaru.Parser.AST: [ArrayLiteral_] :: [abt '[] 'U] -> Term abt 'U
- Language.Hakaru.Parser.AST: [ArrayOp_] :: ArrayOp -> [abt '[] U] -> Term abt U
+ Language.Hakaru.Parser.AST: [ArrayOp_] :: ArrayOp -> [abt '[] 'U] -> Term abt 'U
- Language.Hakaru.Parser.AST: [Array_] :: abt '[] U -> abt '[U] U -> Term abt U
+ Language.Hakaru.Parser.AST: [Array_] :: abt '[] 'U -> abt '[ 'U] 'U -> Term abt 'U
- Language.Hakaru.Parser.AST: [Bucket_] :: abt '[] U -> abt '[] U -> Reducer xs abt U -> Term abt U
+ Language.Hakaru.Parser.AST: [Bucket_] :: abt '[] 'U -> abt '[] 'U -> Reducer xs abt 'U -> Term abt 'U
- Language.Hakaru.Parser.AST: [Case_] :: abt '[] U -> [Branch_ abt] -> Term abt U
+ Language.Hakaru.Parser.AST: [Case_] :: abt '[] 'U -> [Branch_ abt] -> Term abt 'U
- Language.Hakaru.Parser.AST: [Chain_] :: abt '[] U -> abt '[] U -> abt '[U] U -> Term abt U
+ Language.Hakaru.Parser.AST: [Chain_] :: abt '[] 'U -> abt '[] 'U -> abt '[ 'U] 'U -> Term abt 'U
- Language.Hakaru.Parser.AST: [CoerceTo_] :: Some2 Coercion -> abt '[] U -> Term abt U
+ Language.Hakaru.Parser.AST: [CoerceTo_] :: Some2 Coercion -> abt '[] 'U -> Term abt 'U
- Language.Hakaru.Parser.AST: [Datum_] :: Datum abt -> Term abt U
+ Language.Hakaru.Parser.AST: [Datum_] :: Datum abt -> Term abt 'U
- Language.Hakaru.Parser.AST: [Dirac_] :: abt '[] U -> Term abt U
+ Language.Hakaru.Parser.AST: [Dirac_] :: abt '[] 'U -> Term abt 'U
- Language.Hakaru.Parser.AST: [Integrate_] :: abt '[] U -> abt '[] U -> abt '[U] U -> Term abt U
+ Language.Hakaru.Parser.AST: [Integrate_] :: abt '[] 'U -> abt '[] 'U -> abt '[ 'U] 'U -> Term abt 'U
- Language.Hakaru.Parser.AST: [Lam_] :: SSing -> abt '[U] U -> Term abt U
+ Language.Hakaru.Parser.AST: [Lam_] :: SSing -> abt '[ 'U] 'U -> Term abt 'U
- Language.Hakaru.Parser.AST: [Let_] :: abt '[] U -> abt '[U] U -> Term abt U
+ Language.Hakaru.Parser.AST: [Let_] :: abt '[] 'U -> abt '[ 'U] 'U -> Term abt 'U
- Language.Hakaru.Parser.AST: [Literal_] :: Some1 Literal -> Term abt U
+ Language.Hakaru.Parser.AST: [Literal_] :: Some1 Literal -> Term abt 'U
- Language.Hakaru.Parser.AST: [MBind_] :: abt '[] U -> abt '[U] U -> Term abt U
+ Language.Hakaru.Parser.AST: [MBind_] :: abt '[] 'U -> abt '[ 'U] 'U -> Term abt 'U
- Language.Hakaru.Parser.AST: [MeasureOp_] :: SomeOp MeasureOp -> [abt '[] U] -> Term abt U
+ Language.Hakaru.Parser.AST: [MeasureOp_] :: SomeOp MeasureOp -> [abt '[] 'U] -> Term abt 'U
- Language.Hakaru.Parser.AST: [NaryOp_] :: NaryOp -> [abt '[] U] -> Term abt U
+ Language.Hakaru.Parser.AST: [NaryOp_] :: NaryOp -> [abt '[] 'U] -> Term abt 'U
- Language.Hakaru.Parser.AST: [Pair_] :: abt '[] U -> abt '[] U -> Term abt U
+ Language.Hakaru.Parser.AST: [Pair_] :: abt '[] 'U -> abt '[] 'U -> Term abt 'U
- Language.Hakaru.Parser.AST: [Plate_] :: abt '[] U -> abt '[U] U -> Term abt U
+ Language.Hakaru.Parser.AST: [Plate_] :: abt '[] 'U -> abt '[ 'U] 'U -> Term abt 'U
- Language.Hakaru.Parser.AST: [PrimOp_] :: PrimOp -> [abt '[] U] -> Term abt U
+ Language.Hakaru.Parser.AST: [PrimOp_] :: PrimOp -> [abt '[] 'U] -> Term abt 'U
- Language.Hakaru.Parser.AST: [Product_] :: abt '[] U -> abt '[] U -> abt '[U] U -> Term abt U
+ Language.Hakaru.Parser.AST: [Product_] :: abt '[] 'U -> abt '[] 'U -> abt '[ 'U] 'U -> Term abt 'U
- Language.Hakaru.Parser.AST: [R_Add_] :: abt (U : xs) U -> Reducer xs abt U
+ Language.Hakaru.Parser.AST: [R_Add_] :: abt ( 'U : xs) 'U -> Reducer xs abt 'U
- Language.Hakaru.Parser.AST: [R_Fanout_] :: Reducer xs abt U -> Reducer xs abt U -> Reducer xs abt U
+ Language.Hakaru.Parser.AST: [R_Fanout_] :: Reducer xs abt 'U -> Reducer xs abt 'U -> Reducer xs abt 'U
- Language.Hakaru.Parser.AST: [R_Index_] :: Variable U -> abt xs U -> abt (U : xs) U -> Reducer (U : xs) abt U -> Reducer xs abt U
+ Language.Hakaru.Parser.AST: [R_Index_] :: Variable 'U -> abt xs 'U -> abt ( 'U : xs) 'U -> Reducer ( 'U : xs) abt 'U -> Reducer xs abt 'U
- Language.Hakaru.Parser.AST: [R_Nop_] :: Reducer xs abt U
+ Language.Hakaru.Parser.AST: [R_Nop_] :: Reducer xs abt 'U
- Language.Hakaru.Parser.AST: [R_Split_] :: abt (U : xs) U -> Reducer xs abt U -> Reducer xs abt U -> Reducer xs abt U
+ Language.Hakaru.Parser.AST: [R_Split_] :: abt ( 'U : xs) 'U -> Reducer xs abt 'U -> Reducer xs abt 'U -> Reducer xs abt 'U
- Language.Hakaru.Parser.AST: [Reject_] :: Term abt U
+ Language.Hakaru.Parser.AST: [Reject_] :: Term abt 'U
- Language.Hakaru.Parser.AST: [Summate_] :: abt '[] U -> abt '[] U -> abt '[U] U -> Term abt U
+ Language.Hakaru.Parser.AST: [Summate_] :: abt '[] 'U -> abt '[] 'U -> abt '[ 'U] 'U -> Term abt 'U
- Language.Hakaru.Parser.AST: [Superpose_] :: NonEmpty (abt '[] U, abt '[] U) -> Term abt U
+ Language.Hakaru.Parser.AST: [Superpose_] :: NonEmpty (abt '[] 'U, abt '[] 'U) -> Term abt 'U
- Language.Hakaru.Parser.AST: [UnsafeTo_] :: Some2 Coercion -> abt '[] U -> Term abt U
+ Language.Hakaru.Parser.AST: [UnsafeTo_] :: Some2 Coercion -> abt '[] 'U -> Term abt 'U
- Language.Hakaru.Parser.AST: fmapBranch :: (f '[] U -> g '[] U) -> Branch_ f -> Branch_ g
+ Language.Hakaru.Parser.AST: fmapBranch :: (f '[] 'U -> g '[] 'U) -> Branch_ f -> Branch_ g
- Language.Hakaru.Parser.AST: fmapDatum :: (f '[] U -> g '[] U) -> Datum f -> Datum g
+ Language.Hakaru.Parser.AST: fmapDatum :: (f '[] 'U -> g '[] 'U) -> Datum f -> Datum g
- Language.Hakaru.Parser.AST: foldBranch :: (abt '[] U -> m) -> Branch_ abt -> m
+ Language.Hakaru.Parser.AST: foldBranch :: (abt '[] 'U -> m) -> Branch_ abt -> m
- Language.Hakaru.Parser.AST: foldDatum :: (Monoid m) => (abt '[] U -> m) -> Datum abt -> m
+ Language.Hakaru.Parser.AST: foldDatum :: (Monoid m) => (abt '[] 'U -> m) -> Datum abt -> m
- Language.Hakaru.Parser.AST: nameToVar :: Name -> Variable U
+ Language.Hakaru.Parser.AST: nameToVar :: Name -> Variable 'U
- Language.Hakaru.Parser.AST: type AST = U_ABT '[] U
+ Language.Hakaru.Parser.AST: type AST = U_ABT '[] 'U
- Language.Hakaru.Parser.AST: type MetaTerm = Term U_ABT U
+ Language.Hakaru.Parser.AST: type MetaTerm = Term U_ABT 'U
- Language.Hakaru.Parser.Import: expandImports :: ASTWithImport' Text -> ExceptT ParseError IO (AST' Text)
+ Language.Hakaru.Parser.Import: expandImports :: Maybe FilePath -> ASTWithImport' Text -> ExceptT ParseError IO (AST' Text)
- Language.Hakaru.Parser.SymbolResolve: fromVarSet :: VarSet (KProxy :: KProxy Hakaru) -> [Name]
+ Language.Hakaru.Parser.SymbolResolve: fromVarSet :: VarSet ( 'KProxy :: KProxy Hakaru) -> [Name]
- Language.Hakaru.Parser.SymbolResolve: makeName :: SomeVariable (KProxy :: KProxy Hakaru) -> Name
+ Language.Hakaru.Parser.SymbolResolve: makeName :: SomeVariable ( 'KProxy :: KProxy Hakaru) -> Name
- Language.Hakaru.Parser.SymbolResolve: resolveAST' :: [Name] -> AST' Text -> AST
+ Language.Hakaru.Parser.SymbolResolve: resolveAST' :: Nat -> [Name] -> AST' Text -> AST
- Language.Hakaru.Runtime.LogFloatPrelude: (**) :: LogFloat -> Double -> LogFloat
+ Language.Hakaru.Runtime.LogFloatPrelude: (**) :: Prob -> Double -> Prob
- Language.Hakaru.Runtime.LogFloatPrelude: Branch :: (a -> Maybe b) -> Branch a b
+ Language.Hakaru.Runtime.LogFloatPrelude: Branch :: a -> Maybe b -> Branch a b
- Language.Hakaru.Runtime.LogFloatPrelude: Reducer :: (xs -> ST s cell) -> (xs -> Int -> cell -> ST s ()) -> (cell -> ST s a) -> Reducer xs s a
+ Language.Hakaru.Runtime.LogFloatPrelude: Reducer :: xs -> ST s cell -> xs -> Int -> cell -> ST s () -> cell -> ST s a -> Reducer xs s a
- Language.Hakaru.Runtime.LogFloatPrelude: beta :: LogFloat -> LogFloat -> Measure LogFloat
+ Language.Hakaru.Runtime.LogFloatPrelude: beta :: Prob -> Prob -> Measure Prob
- Language.Hakaru.Runtime.LogFloatPrelude: categorical :: MayBoxVec LogFloat LogFloat -> Measure Int
+ Language.Hakaru.Runtime.LogFloatPrelude: categorical :: MayBoxVec Prob Prob -> Measure Int
- Language.Hakaru.Runtime.LogFloatPrelude: class Num a => Num' a where product a b f = foldl' (\ x y -> x * f y) 1 [a .. b - 1] summate a b f = foldl' (\ x y -> x + f y) 0 [a .. b - 1]
+ Language.Hakaru.Runtime.LogFloatPrelude: class Num a => Num' a
- Language.Hakaru.Runtime.LogFloatPrelude: exp :: Double -> LogFloat
+ Language.Hakaru.Runtime.LogFloatPrelude: exp :: Double -> Prob
- Language.Hakaru.Runtime.LogFloatPrelude: fromProb :: LogFloat -> Double
+ Language.Hakaru.Runtime.LogFloatPrelude: fromProb :: Prob -> Double
- Language.Hakaru.Runtime.LogFloatPrelude: gamma :: LogFloat -> LogFloat -> Measure LogFloat
+ Language.Hakaru.Runtime.LogFloatPrelude: gamma :: Prob -> Prob -> Measure Prob
- Language.Hakaru.Runtime.LogFloatPrelude: log :: LogFloat -> Double
+ Language.Hakaru.Runtime.LogFloatPrelude: log :: Prob -> Double
- Language.Hakaru.Runtime.LogFloatPrelude: nat2prob :: Int -> LogFloat
+ Language.Hakaru.Runtime.LogFloatPrelude: nat2prob :: Int -> Prob
- Language.Hakaru.Runtime.LogFloatPrelude: normal :: Double -> LogFloat -> Measure Double
+ Language.Hakaru.Runtime.LogFloatPrelude: normal :: Double -> Prob -> Measure Double
- Language.Hakaru.Runtime.LogFloatPrelude: pi :: LogFloat
+ Language.Hakaru.Runtime.LogFloatPrelude: pi :: Prob
- Language.Hakaru.Runtime.LogFloatPrelude: pose :: LogFloat -> Measure a -> Measure a
+ Language.Hakaru.Runtime.LogFloatPrelude: pose :: Prob -> Measure a -> Measure a
- Language.Hakaru.Runtime.LogFloatPrelude: prob_ :: NonNegativeRational -> LogFloat
+ Language.Hakaru.Runtime.LogFloatPrelude: prob_ :: NonNegativeRational -> Prob
- Language.Hakaru.Runtime.LogFloatPrelude: superpose :: [(LogFloat, Measure a)] -> Measure a
+ Language.Hakaru.Runtime.LogFloatPrelude: superpose :: [(Prob, Measure a)] -> Measure a
- Language.Hakaru.Runtime.LogFloatPrelude: thRootOf :: Int -> LogFloat -> LogFloat
+ Language.Hakaru.Runtime.LogFloatPrelude: thRootOf :: Int -> Prob -> Prob
- Language.Hakaru.Runtime.LogFloatPrelude: unsafeProb :: Double -> LogFloat
+ Language.Hakaru.Runtime.LogFloatPrelude: unsafeProb :: Double -> Prob
- Language.Hakaru.Runtime.Prelude: Branch :: (a -> Maybe b) -> Branch a b
+ Language.Hakaru.Runtime.Prelude: Branch :: a -> Maybe b -> Branch a b
- Language.Hakaru.Runtime.Prelude: Reducer :: (xs -> ST s cell) -> (xs -> Int -> cell -> ST s ()) -> (cell -> ST s a) -> Reducer xs s a
+ Language.Hakaru.Runtime.Prelude: Reducer :: xs -> ST s cell -> xs -> Int -> cell -> ST s () -> cell -> ST s a -> Reducer xs s a
- Language.Hakaru.Runtime.Prelude: beta :: Double -> Double -> Measure Double
+ Language.Hakaru.Runtime.Prelude: beta :: Prob -> Prob -> Measure Prob
- Language.Hakaru.Runtime.Prelude: categorical :: MayBoxVec Double Double -> Measure Int
+ Language.Hakaru.Runtime.Prelude: categorical :: MayBoxVec Prob Prob -> Measure Int
- Language.Hakaru.Runtime.Prelude: fromProb :: Double -> Double
+ Language.Hakaru.Runtime.Prelude: fromProb :: Prob -> Double
- Language.Hakaru.Runtime.Prelude: gamma :: Double -> Double -> Measure Double
+ Language.Hakaru.Runtime.Prelude: gamma :: Prob -> Prob -> Measure Prob
- Language.Hakaru.Runtime.Prelude: nat2prob :: Int -> Double
+ Language.Hakaru.Runtime.Prelude: nat2prob :: Int -> Prob
- Language.Hakaru.Runtime.Prelude: normal :: Double -> Double -> Measure Double
+ Language.Hakaru.Runtime.Prelude: normal :: Double -> Prob -> Measure Double
- Language.Hakaru.Runtime.Prelude: pose :: Double -> Measure a -> Measure a
+ Language.Hakaru.Runtime.Prelude: pose :: Prob -> Measure a -> Measure a
- Language.Hakaru.Runtime.Prelude: prob_ :: NonNegativeRational -> Double
+ Language.Hakaru.Runtime.Prelude: prob_ :: NonNegativeRational -> Prob
- Language.Hakaru.Runtime.Prelude: superpose :: [(Double, Measure a)] -> Measure a
+ Language.Hakaru.Runtime.Prelude: superpose :: [(Prob, Measure a)] -> Measure a
- Language.Hakaru.Runtime.Prelude: thRootOf :: Int -> Double -> Double
+ Language.Hakaru.Runtime.Prelude: thRootOf :: Int -> Prob -> Prob
- Language.Hakaru.Runtime.Prelude: unsafeProb :: Double -> Double
+ Language.Hakaru.Runtime.Prelude: unsafeProb :: Double -> Prob
- Language.Hakaru.Sample: evaluateArray :: (ABT Term abt) => (abt '[] HNat) -> (abt '[HNat] a) -> Env -> Value (HArray a)
+ Language.Hakaru.Sample: evaluateArray :: (ABT Term abt) => (abt '[] 'HNat) -> (abt '[ 'HNat] a) -> Env -> Value ( 'HArray a)
- Language.Hakaru.Sample: evaluateBucket :: (ABT Term abt) => abt '[] HNat -> abt '[] HNat -> Reducer abt '[] a -> Env -> Value a
+ Language.Hakaru.Sample: evaluateBucket :: (ABT Term abt) => abt '[] 'HNat -> abt '[] 'HNat -> Reducer abt '[] a -> Env -> Value a
- Language.Hakaru.Sample: evaluateEmpty :: Value (HArray a)
+ Language.Hakaru.Sample: evaluateEmpty :: Value ( 'HArray a)
- Language.Hakaru.Sample: evaluateMeasureOp :: (ABT Term abt, typs ~ UnLCs args, args ~ LCs typs) => MeasureOp typs a -> SArgs abt args -> Env -> Value (HMeasure a)
+ Language.Hakaru.Sample: evaluateMeasureOp :: (ABT Term abt, typs ~ UnLCs args, args ~ LCs typs) => MeasureOp typs a -> SArgs abt args -> Env -> Value ( 'HMeasure a)
- Language.Hakaru.Sample: evaluateSuperpose :: (ABT Term abt) => NonEmpty (abt '[] HProb, abt '[] (HMeasure a)) -> Env -> Value (HMeasure a)
+ Language.Hakaru.Sample: evaluateSuperpose :: (ABT Term abt) => NonEmpty (abt '[] 'HProb, abt '[] ( 'HMeasure a)) -> Env -> Value ( 'HMeasure a)
- Language.Hakaru.Sample: normalize :: [Value HProb] -> (LogFloat, Double, [Double])
+ Language.Hakaru.Sample: normalize :: [Value 'HProb] -> (LogFloat, Double, [Double])
- Language.Hakaru.Sample: normalizeVector :: Value (HArray HProb) -> (LogFloat, Double, Vector Double)
+ Language.Hakaru.Sample: normalizeVector :: Value ( 'HArray 'HProb) -> (LogFloat, Double, Vector Double)
- Language.Hakaru.Syntax.ABT: class ABT (syn :: ([k] -> k -> *) -> k -> *) (abt :: [k] -> k -> *) | abt -> syn where nextFree = nextVarID . freeVars nextFreeOrBind e = nextFree e `max` nextBind e
+ Language.Hakaru.Syntax.ABT: class ABT (syn :: ([k] -> k -> *) -> k -> *) (abt :: [k] -> k -> *) | abt -> syn
- Language.Hakaru.Syntax.AST: [Acos] :: PrimOp '[HReal] HReal
+ Language.Hakaru.Syntax.AST: [Acos] :: PrimOp '[ 'HReal] 'HReal
- Language.Hakaru.Syntax.AST: [Acosh] :: PrimOp '[HReal] HReal
+ Language.Hakaru.Syntax.AST: [Acosh] :: PrimOp '[ 'HReal] 'HReal
- Language.Hakaru.Syntax.AST: [ArrayLiteral_] :: [abt '[] a] -> Term abt (HArray a)
+ Language.Hakaru.Syntax.AST: [ArrayLiteral_] :: [abt '[] a] -> Term abt ( 'HArray a)
- Language.Hakaru.Syntax.AST: [Array_] :: !(abt '[] HNat) -> !(abt '[HNat] a) -> Term abt (HArray a)
+ Language.Hakaru.Syntax.AST: [Array_] :: !(abt '[] 'HNat) -> !(abt '[ 'HNat] a) -> Term abt ( 'HArray a)
- Language.Hakaru.Syntax.AST: [Asin] :: PrimOp '[HReal] HReal
+ Language.Hakaru.Syntax.AST: [Asin] :: PrimOp '[ 'HReal] 'HReal
- Language.Hakaru.Syntax.AST: [Asinh] :: PrimOp '[HReal] HReal
+ Language.Hakaru.Syntax.AST: [Asinh] :: PrimOp '[ 'HReal] 'HReal
- Language.Hakaru.Syntax.AST: [Atan] :: PrimOp '[HReal] HReal
+ Language.Hakaru.Syntax.AST: [Atan] :: PrimOp '[ 'HReal] 'HReal
- Language.Hakaru.Syntax.AST: [Atanh] :: PrimOp '[HReal] HReal
+ Language.Hakaru.Syntax.AST: [Atanh] :: PrimOp '[ 'HReal] 'HReal
- Language.Hakaru.Syntax.AST: [BetaFunc] :: PrimOp '[HProb, HProb] HProb
+ Language.Hakaru.Syntax.AST: [BetaFunc] :: PrimOp '[ 'HProb, 'HProb] 'HProb
- Language.Hakaru.Syntax.AST: [Beta] :: MeasureOp '[HProb, HProb] HProb
+ Language.Hakaru.Syntax.AST: [Beta] :: MeasureOp '[ 'HProb, 'HProb] 'HProb
- Language.Hakaru.Syntax.AST: [Bucket] :: !(abt '[] HNat) -> !(abt '[] HNat) -> Reducer abt '[] a -> Term abt a
+ Language.Hakaru.Syntax.AST: [Bucket] :: !(abt '[] 'HNat) -> !(abt '[] 'HNat) -> Reducer abt '[] a -> Term abt a
- Language.Hakaru.Syntax.AST: [Categorical] :: MeasureOp '[HArray HProb] HNat
+ Language.Hakaru.Syntax.AST: [Categorical] :: MeasureOp '[ 'HArray 'HProb] 'HNat
- Language.Hakaru.Syntax.AST: [Chain] :: SCon '[LC HNat, LC s, '('[s], HMeasure (HPair a s))] (HMeasure (HPair (HArray a) s))
+ Language.Hakaru.Syntax.AST: [Chain] :: SCon '[LC 'HNat, LC s, '('[s], 'HMeasure (HPair a s))] ( 'HMeasure (HPair ( 'HArray a) s))
- Language.Hakaru.Syntax.AST: [Cos] :: PrimOp '[HReal] HReal
+ Language.Hakaru.Syntax.AST: [Cos] :: PrimOp '[ 'HReal] 'HReal
- Language.Hakaru.Syntax.AST: [Cosh] :: PrimOp '[HReal] HReal
+ Language.Hakaru.Syntax.AST: [Cosh] :: PrimOp '[ 'HReal] 'HReal
- Language.Hakaru.Syntax.AST: [Counting] :: MeasureOp '[] HInt
+ Language.Hakaru.Syntax.AST: [Counting] :: MeasureOp '[] 'HInt
- Language.Hakaru.Syntax.AST: [Dirac] :: SCon '[LC a] (HMeasure a)
+ Language.Hakaru.Syntax.AST: [Dirac] :: SCon '[LC a] ( 'HMeasure a)
- Language.Hakaru.Syntax.AST: [Empty_] :: !(Sing (HArray a)) -> Term abt (HArray a)
+ Language.Hakaru.Syntax.AST: [Empty_] :: !(Sing ( 'HArray a)) -> Term abt ( 'HArray a)
- Language.Hakaru.Syntax.AST: [Exp] :: PrimOp '[HReal] HProb
+ Language.Hakaru.Syntax.AST: [Exp] :: PrimOp '[ 'HReal] 'HProb
- Language.Hakaru.Syntax.AST: [Expect] :: SCon '[LC (HMeasure a), '('[a], HProb)] HProb
+ Language.Hakaru.Syntax.AST: [Expect] :: Transform '[LC ( 'HMeasure a), '('[a], 'HProb)] 'HProb
- Language.Hakaru.Syntax.AST: [GammaFunc] :: PrimOp '[HReal] HProb
+ Language.Hakaru.Syntax.AST: [GammaFunc] :: PrimOp '[ 'HReal] 'HProb
- Language.Hakaru.Syntax.AST: [Gamma] :: MeasureOp '[HProb, HProb] HProb
+ Language.Hakaru.Syntax.AST: [Gamma] :: MeasureOp '[ 'HProb, 'HProb] 'HProb
- Language.Hakaru.Syntax.AST: [Index] :: !(Sing a) -> ArrayOp '[HArray a, HNat] a
+ Language.Hakaru.Syntax.AST: [Index] :: !(Sing a) -> ArrayOp '[ 'HArray a, 'HNat] a
- Language.Hakaru.Syntax.AST: [Integrate] :: SCon '[LC HReal, LC HReal, '('[HReal], HProb)] HProb
+ Language.Hakaru.Syntax.AST: [Integrate] :: SCon '[LC 'HReal, LC 'HReal, '('[ 'HReal], 'HProb)] 'HProb
- Language.Hakaru.Syntax.AST: [LInt] :: !Integer -> Literal HInt
+ Language.Hakaru.Syntax.AST: [LInt] :: !Integer -> Literal 'HInt
- Language.Hakaru.Syntax.AST: [LNat] :: !Natural -> Literal HNat
+ Language.Hakaru.Syntax.AST: [LNat] :: !Natural -> Literal 'HNat
- Language.Hakaru.Syntax.AST: [LProb] :: {-# UNPACK #-} !NonNegativeRational -> Literal HProb
+ Language.Hakaru.Syntax.AST: [LProb] :: {-# UNPACK #-} !NonNegativeRational -> Literal 'HProb
- Language.Hakaru.Syntax.AST: [LReal] :: {-# UNPACK #-} !Rational -> Literal HReal
+ Language.Hakaru.Syntax.AST: [LReal] :: {-# UNPACK #-} !Rational -> Literal 'HReal
- Language.Hakaru.Syntax.AST: [Lebesgue] :: MeasureOp '[] HReal
+ Language.Hakaru.Syntax.AST: [Lebesgue] :: MeasureOp '[ 'HReal, 'HReal] 'HReal
- Language.Hakaru.Syntax.AST: [Log] :: PrimOp '[HProb] HReal
+ Language.Hakaru.Syntax.AST: [Log] :: PrimOp '[ 'HProb] 'HReal
- Language.Hakaru.Syntax.AST: [MBind] :: SCon '[LC (HMeasure a), '('[a], HMeasure b)] (HMeasure b)
+ Language.Hakaru.Syntax.AST: [MBind] :: SCon '[LC ( 'HMeasure a), '('[a], 'HMeasure b)] ( 'HMeasure b)
- Language.Hakaru.Syntax.AST: [MeasureOp_] :: (typs ~ UnLCs args, args ~ LCs typs) => !(MeasureOp typs a) -> SCon args (HMeasure a)
+ Language.Hakaru.Syntax.AST: [MeasureOp_] :: (typs ~ UnLCs args, args ~ LCs typs) => !(MeasureOp typs a) -> SCon args ( 'HMeasure a)
- Language.Hakaru.Syntax.AST: [NatPow] :: !(HSemiring a) -> PrimOp '[a, HNat] a
+ Language.Hakaru.Syntax.AST: [NatPow] :: !(HSemiring a) -> PrimOp '[a, 'HNat] a
- Language.Hakaru.Syntax.AST: [NatRoot] :: !(HRadical a) -> PrimOp '[a, HNat] a
+ Language.Hakaru.Syntax.AST: [NatRoot] :: !(HRadical a) -> PrimOp '[a, 'HNat] a
- Language.Hakaru.Syntax.AST: [Normal] :: MeasureOp '[HReal, HProb] HReal
+ Language.Hakaru.Syntax.AST: [Normal] :: MeasureOp '[ 'HReal, 'HProb] 'HReal
- Language.Hakaru.Syntax.AST: [Observe] :: SCon '[LC (HMeasure a), LC a] (HMeasure a)
+ Language.Hakaru.Syntax.AST: [Observe] :: Transform '[LC ( 'HMeasure a), LC a] ( 'HMeasure a)
- Language.Hakaru.Syntax.AST: [Pi] :: PrimOp '[] HProb
+ Language.Hakaru.Syntax.AST: [Pi] :: PrimOp '[] 'HProb
- Language.Hakaru.Syntax.AST: [Plate] :: SCon '[LC HNat, '('[HNat], HMeasure a)] (HMeasure (HArray a))
+ Language.Hakaru.Syntax.AST: [Plate] :: SCon '[LC 'HNat, '('[ 'HNat], 'HMeasure a)] ( 'HMeasure ( 'HArray a))
- Language.Hakaru.Syntax.AST: [Poisson] :: MeasureOp '[HProb] HNat
+ Language.Hakaru.Syntax.AST: [Poisson] :: MeasureOp '[ 'HProb] 'HNat
- Language.Hakaru.Syntax.AST: [RealPow] :: PrimOp '[HProb, HReal] HProb
+ Language.Hakaru.Syntax.AST: [RealPow] :: PrimOp '[ 'HProb, 'HReal] 'HProb
- Language.Hakaru.Syntax.AST: [Reduce] :: !(Sing a) -> ArrayOp '[a :-> (a :-> a), a, HArray a] a
+ Language.Hakaru.Syntax.AST: [Reduce] :: !(Sing a) -> ArrayOp '[a :-> a :-> a, a, 'HArray a] a
- Language.Hakaru.Syntax.AST: [Reject_] :: !(Sing (HMeasure a)) -> Term abt (HMeasure a)
+ Language.Hakaru.Syntax.AST: [Reject_] :: !(Sing ( 'HMeasure a)) -> Term abt ( 'HMeasure a)
- Language.Hakaru.Syntax.AST: [Sin] :: PrimOp '[HReal] HReal
+ Language.Hakaru.Syntax.AST: [Sin] :: PrimOp '[ 'HReal] 'HReal
- Language.Hakaru.Syntax.AST: [Sinh] :: PrimOp '[HReal] HReal
+ Language.Hakaru.Syntax.AST: [Sinh] :: PrimOp '[ 'HReal] 'HReal
- Language.Hakaru.Syntax.AST: [Size] :: !(Sing a) -> ArrayOp '[HArray a] HNat
+ Language.Hakaru.Syntax.AST: [Size] :: !(Sing a) -> ArrayOp '[ 'HArray a] 'HNat
- Language.Hakaru.Syntax.AST: [Superpose_] :: NonEmpty (abt '[] HProb, abt '[] (HMeasure a)) -> Term abt (HMeasure a)
+ Language.Hakaru.Syntax.AST: [Superpose_] :: NonEmpty (abt '[] 'HProb, abt '[] ( 'HMeasure a)) -> Term abt ( 'HMeasure a)
- Language.Hakaru.Syntax.AST: [Tan] :: PrimOp '[HReal] HReal
+ Language.Hakaru.Syntax.AST: [Tan] :: PrimOp '[ 'HReal] 'HReal
- Language.Hakaru.Syntax.AST: [Tanh] :: PrimOp '[HReal] HReal
+ Language.Hakaru.Syntax.AST: [Tanh] :: PrimOp '[ 'HReal] 'HReal
- Language.Hakaru.Syntax.AST: [Uniform] :: MeasureOp '[HReal, HReal] HReal
+ Language.Hakaru.Syntax.AST: [Uniform] :: MeasureOp '[ 'HReal, 'HReal] 'HReal
- Language.Hakaru.Syntax.AST.Eq: alphaEq :: forall abt a. (ABT Term abt) => abt '[] a -> abt '[] a -> Bool
+ Language.Hakaru.Syntax.AST.Eq: alphaEq :: forall abt d. (ABT Term abt) => abt '[] d -> abt '[] d -> Bool
- Language.Hakaru.Syntax.Datum: [Ident] :: !(ast a) -> DatumFun I ast a
+ Language.Hakaru.Syntax.Datum: [Ident] :: !(ast a) -> DatumFun 'I ast a
- Language.Hakaru.Syntax.Datum: [Konst] :: !(ast b) -> DatumFun (K b) ast a
+ Language.Hakaru.Syntax.Datum: [Konst] :: !(ast b) -> DatumFun ( 'K b) ast a
- Language.Hakaru.Syntax.Datum: [PIdent] :: !(Pattern vars a) -> PDatumFun I vars a
+ Language.Hakaru.Syntax.Datum: [PIdent] :: !(Pattern vars a) -> PDatumFun 'I vars a
- Language.Hakaru.Syntax.Datum: [PKonst] :: !(Pattern vars b) -> PDatumFun (K b) vars a
+ Language.Hakaru.Syntax.Datum: [PKonst] :: !(Pattern vars b) -> PDatumFun ( 'K b) vars a
- Language.Hakaru.Syntax.IClasses: DList1 :: (forall ys. List1 a ys -> List1 a (xs ++ ys)) -> DList1 a xs
+ Language.Hakaru.Syntax.IClasses: DList1 :: forall ys. List1 a ys -> List1 a (xs ++ ys) -> DList1 a xs
- Language.Hakaru.Syntax.IClasses: class Functor11 f => Foldable11 (f :: (k1 -> *) -> k2 -> *) where fold11 = foldMap11 unLift1 foldMap11 f = fold11 . fmap11 (Lift1 . f)
+ Language.Hakaru.Syntax.IClasses: class Functor11 f => Foldable11 (f :: (k1 -> *) -> k2 -> *)
- Language.Hakaru.Syntax.IClasses: class Functor12 f => Foldable12 (f :: (k1 -> *) -> k2 -> k3 -> *) where fold12 = foldMap12 unLift1 foldMap12 f = fold12 . fmap12 (Lift1 . f)
+ Language.Hakaru.Syntax.IClasses: class Functor12 f => Foldable12 (f :: (k1 -> *) -> k2 -> k3 -> *)
- Language.Hakaru.Syntax.IClasses: class Functor21 f => Foldable21 (f :: (k1 -> k2 -> *) -> k3 -> *) where fold21 = foldMap21 unLift2 foldMap21 f = fold21 . fmap21 (Lift2 . f)
+ Language.Hakaru.Syntax.IClasses: class Functor21 f => Foldable21 (f :: (k1 -> k2 -> *) -> k3 -> *)
- Language.Hakaru.Syntax.IClasses: class Functor22 f => Foldable22 (f :: (k1 -> k2 -> *) -> k3 -> k4 -> *) where fold22 = foldMap22 unLift2 foldMap22 f = fold22 . fmap22 (Lift2 . f)
+ Language.Hakaru.Syntax.IClasses: class Functor22 f => Foldable22 (f :: (k1 -> k2 -> *) -> k3 -> k4 -> *)
- Language.Hakaru.Syntax.IClasses: class Show1 (a :: k -> *) where showsPrec1 _ x s = show1 x ++ s show1 x = shows1 x ""
+ Language.Hakaru.Syntax.IClasses: class Show1 (a :: k -> *)
- Language.Hakaru.Syntax.IClasses: class Show2 (a :: k1 -> k2 -> *) where showsPrec2 _ x s = show2 x ++ s show2 x = shows2 x ""
+ Language.Hakaru.Syntax.IClasses: class Show2 (a :: k1 -> k2 -> *)
- Language.Hakaru.Syntax.IClasses: fold11 :: (Foldable11 f, Monoid m) => f (Lift1 m) i -> m
+ Language.Hakaru.Syntax.IClasses: fold11 :: (Foldable11 f, (Monoid m)) => f (Lift1 m) i -> m
- Language.Hakaru.Syntax.IClasses: fold12 :: (Foldable12 f, Monoid m) => f (Lift1 m) j l -> m
+ Language.Hakaru.Syntax.IClasses: fold12 :: (Foldable12 f, (Monoid m)) => f (Lift1 m) j l -> m
- Language.Hakaru.Syntax.IClasses: fold21 :: (Foldable21 f, Monoid m) => f (Lift2 m) j -> m
+ Language.Hakaru.Syntax.IClasses: fold21 :: (Foldable21 f, (Monoid m)) => f (Lift2 m) j -> m
- Language.Hakaru.Syntax.IClasses: fold22 :: (Foldable22 f, Monoid m) => f (Lift2 m) j l -> m
+ Language.Hakaru.Syntax.IClasses: fold22 :: (Foldable22 f, (Monoid m)) => f (Lift2 m) j l -> m
- Language.Hakaru.Syntax.IClasses: foldMap11 :: (Foldable11 f, Monoid m) => (forall i. a i -> m) -> f a j -> m
+ Language.Hakaru.Syntax.IClasses: foldMap11 :: (Foldable11 f, (Monoid m)) => (forall i. a i -> m) -> f a j -> m
- Language.Hakaru.Syntax.IClasses: foldMap12 :: (Foldable12 f, Monoid m) => (forall i. a i -> m) -> f a j l -> m
+ Language.Hakaru.Syntax.IClasses: foldMap12 :: (Foldable12 f, (Monoid m)) => (forall i. a i -> m) -> f a j l -> m
- Language.Hakaru.Syntax.IClasses: foldMap21 :: (Foldable21 f, Monoid m) => (forall h i. a h i -> m) -> f a j -> m
+ Language.Hakaru.Syntax.IClasses: foldMap21 :: (Foldable21 f, (Monoid m)) => (forall h i. a h i -> m) -> f a j -> m
- Language.Hakaru.Syntax.IClasses: foldMap22 :: (Foldable22 f, Monoid m) => (forall h i. a h i -> m) -> f a j l -> m
+ Language.Hakaru.Syntax.IClasses: foldMap22 :: (Foldable22 f, (Monoid m)) => (forall h i. a h i -> m) -> f a j l -> m
- Language.Hakaru.Syntax.Prelude: (!) :: (ABT Term abt) => abt '[] (HArray a) -> abt '[] HNat -> abt '[] a
+ Language.Hakaru.Syntax.Prelude: (!) :: (ABT Term abt) => abt '[] ( 'HArray a) -> abt '[] 'HNat -> abt '[] a
- Language.Hakaru.Syntax.Prelude: (**) :: (RealProb a, ABT Term abt) => abt '[] HProb -> abt '[] a -> abt '[] HProb
+ Language.Hakaru.Syntax.Prelude: (**) :: (RealProb a, (ABT Term abt)) => abt '[] 'HProb -> abt '[] a -> abt '[] 'HProb
- Language.Hakaru.Syntax.Prelude: (*>) :: (ABT Term abt, SingI a) => abt '[] (HMeasure a) -> abt '[] (HMeasure b) -> abt '[] (HMeasure b)
+ Language.Hakaru.Syntax.Prelude: (*>) :: (ABT Term abt, SingI a) => abt '[] ( 'HMeasure a) -> abt '[] ( 'HMeasure b) -> abt '[] ( 'HMeasure b)
- Language.Hakaru.Syntax.Prelude: (<$>) :: (ABT Term abt, SingI a) => (abt '[] a -> abt '[] b) -> abt '[] (HMeasure a) -> abt '[] (HMeasure b)
+ Language.Hakaru.Syntax.Prelude: (<$>) :: (ABT Term abt, SingI a) => (abt '[] a -> abt '[] b) -> abt '[] ( 'HMeasure a) -> abt '[] ( 'HMeasure b)
- Language.Hakaru.Syntax.Prelude: (<*) :: (ABT Term abt, SingI a, SingI b) => abt '[] (HMeasure a) -> abt '[] (HMeasure b) -> abt '[] (HMeasure a)
+ Language.Hakaru.Syntax.Prelude: (<*) :: (ABT Term abt, SingI a, SingI b) => abt '[] ( 'HMeasure a) -> abt '[] ( 'HMeasure b) -> abt '[] ( 'HMeasure a)
- Language.Hakaru.Syntax.Prelude: (<*>) :: (ABT Term abt, SingI a, SingI b) => abt '[] (HMeasure (a :-> b)) -> abt '[] (HMeasure a) -> abt '[] (HMeasure b)
+ Language.Hakaru.Syntax.Prelude: (<*>) :: (ABT Term abt, SingI a, SingI b) => abt '[] ( 'HMeasure (a :-> b)) -> abt '[] ( 'HMeasure a) -> abt '[] ( 'HMeasure b)
- Language.Hakaru.Syntax.Prelude: (<|>) :: (ABT Term abt) => abt '[] (HMeasure a) -> abt '[] (HMeasure a) -> abt '[] (HMeasure a)
+ Language.Hakaru.Syntax.Prelude: (<|>) :: (ABT Term abt) => abt '[] ( 'HMeasure a) -> abt '[] ( 'HMeasure a) -> abt '[] ( 'HMeasure a)
- Language.Hakaru.Syntax.Prelude: (>>) :: (ABT Term abt, SingI a) => abt '[] (HMeasure a) -> abt '[] (HMeasure b) -> abt '[] (HMeasure b)
+ Language.Hakaru.Syntax.Prelude: (>>) :: (ABT Term abt, SingI a) => abt '[] ( 'HMeasure a) -> abt '[] ( 'HMeasure b) -> abt '[] ( 'HMeasure b)
- Language.Hakaru.Syntax.Prelude: (>>=) :: (ABT Term abt) => abt '[] (HMeasure a) -> (abt '[] a -> abt '[] (HMeasure b)) -> abt '[] (HMeasure b)
+ Language.Hakaru.Syntax.Prelude: (>>=) :: (ABT Term abt) => abt '[] ( 'HMeasure a) -> (abt '[] a -> abt '[] ( 'HMeasure b)) -> abt '[] ( 'HMeasure b)
- Language.Hakaru.Syntax.Prelude: (^) :: (ABT Term abt, HSemiring_ a) => abt '[] a -> abt '[] HNat -> abt '[] a
+ Language.Hakaru.Syntax.Prelude: (^) :: (ABT Term abt, HSemiring_ a) => abt '[] a -> abt '[] 'HNat -> abt '[] a
- Language.Hakaru.Syntax.Prelude: (^^) :: (ABT Term abt, HFractional_ a) => abt '[] a -> abt '[] HInt -> abt '[] a
+ Language.Hakaru.Syntax.Prelude: (^^) :: (ABT Term abt, HFractional_ a) => abt '[] a -> abt '[] 'HInt -> abt '[] a
- Language.Hakaru.Syntax.Prelude: acos :: (ABT Term abt) => abt '[] HReal -> abt '[] HReal
+ Language.Hakaru.Syntax.Prelude: acos :: (ABT Term abt) => abt '[] 'HReal -> abt '[] 'HReal
- Language.Hakaru.Syntax.Prelude: acosh :: (ABT Term abt) => abt '[] HReal -> abt '[] HReal
+ Language.Hakaru.Syntax.Prelude: acosh :: (ABT Term abt) => abt '[] 'HReal -> abt '[] 'HReal
- Language.Hakaru.Syntax.Prelude: app2 :: (ABT Term abt) => abt '[] (a :-> (b :-> c)) -> abt '[] a -> abt '[] b -> abt '[] c
+ Language.Hakaru.Syntax.Prelude: app2 :: (ABT Term abt) => abt '[] (a :-> b :-> c) -> abt '[] a -> abt '[] b -> abt '[] c
- Language.Hakaru.Syntax.Prelude: app3 :: (ABT Term abt) => abt '[] (a :-> (b :-> (c :-> d))) -> abt '[] a -> abt '[] b -> abt '[] c -> abt '[] d
+ Language.Hakaru.Syntax.Prelude: app3 :: (ABT Term abt) => abt '[] (a :-> b :-> c :-> d) -> abt '[] a -> abt '[] b -> abt '[] c -> abt '[] d
- Language.Hakaru.Syntax.Prelude: appendV :: (ABT Term abt) => abt '[] (HArray a) -> abt '[] (HArray a) -> abt '[] (HArray a)
+ Language.Hakaru.Syntax.Prelude: appendV :: (ABT Term abt) => abt '[] ( 'HArray a) -> abt '[] ( 'HArray a) -> abt '[] ( 'HArray a)
- Language.Hakaru.Syntax.Prelude: array :: (ABT Term abt) => abt '[] HNat -> (abt '[] HNat -> abt '[] a) -> abt '[] (HArray a)
+ Language.Hakaru.Syntax.Prelude: array :: (ABT Term abt) => abt '[] 'HNat -> (abt '[] 'HNat -> abt '[] a) -> abt '[] ( 'HArray a)
- Language.Hakaru.Syntax.Prelude: arrayLit :: (ABT Term abt) => [abt '[] a] -> abt '[] (HArray a)
+ Language.Hakaru.Syntax.Prelude: arrayLit :: (ABT Term abt) => [abt '[] a] -> abt '[] ( 'HArray a)
- Language.Hakaru.Syntax.Prelude: arrayWithVar :: (ABT Term abt) => abt '[] HNat -> Variable HNat -> abt '[] a -> abt '[] (HArray a)
+ Language.Hakaru.Syntax.Prelude: arrayWithVar :: (ABT Term abt) => abt '[] 'HNat -> Variable 'HNat -> abt '[] a -> abt '[] ( 'HArray a)
- Language.Hakaru.Syntax.Prelude: asin :: (ABT Term abt) => abt '[] HReal -> abt '[] HReal
+ Language.Hakaru.Syntax.Prelude: asin :: (ABT Term abt) => abt '[] 'HReal -> abt '[] 'HReal
- Language.Hakaru.Syntax.Prelude: asinh :: (ABT Term abt) => abt '[] HReal -> abt '[] HReal
+ Language.Hakaru.Syntax.Prelude: asinh :: (ABT Term abt) => abt '[] 'HReal -> abt '[] 'HReal
- Language.Hakaru.Syntax.Prelude: atan :: (ABT Term abt) => abt '[] HReal -> abt '[] HReal
+ Language.Hakaru.Syntax.Prelude: atan :: (ABT Term abt) => abt '[] 'HReal -> abt '[] 'HReal
- Language.Hakaru.Syntax.Prelude: atanh :: (ABT Term abt) => abt '[] HReal -> abt '[] HReal
+ Language.Hakaru.Syntax.Prelude: atanh :: (ABT Term abt) => abt '[] 'HReal -> abt '[] 'HReal
- Language.Hakaru.Syntax.Prelude: bern :: (ABT Term abt) => abt '[] HProb -> abt '[] (HMeasure HBool)
+ Language.Hakaru.Syntax.Prelude: bern :: (ABT Term abt) => abt '[] 'HProb -> abt '[] ( 'HMeasure HBool)
- Language.Hakaru.Syntax.Prelude: beta :: (ABT Term abt) => abt '[] HProb -> abt '[] HProb -> abt '[] (HMeasure HProb)
+ Language.Hakaru.Syntax.Prelude: beta :: (ABT Term abt) => abt '[] 'HProb -> abt '[] 'HProb -> abt '[] ( 'HMeasure 'HProb)
- Language.Hakaru.Syntax.Prelude: beta' :: (ABT Term abt) => abt '[] HProb -> abt '[] HProb -> abt '[] (HMeasure HProb)
+ Language.Hakaru.Syntax.Prelude: beta' :: (ABT Term abt) => abt '[] 'HProb -> abt '[] 'HProb -> abt '[] ( 'HMeasure 'HProb)
- Language.Hakaru.Syntax.Prelude: beta'' :: (ABT Term abt) => abt '[] HProb -> abt '[] HProb -> abt '[] (HMeasure HProb)
+ Language.Hakaru.Syntax.Prelude: beta'' :: (ABT Term abt) => abt '[] 'HProb -> abt '[] 'HProb -> abt '[] ( 'HMeasure 'HProb)
- Language.Hakaru.Syntax.Prelude: betaFunc :: (ABT Term abt) => abt '[] HProb -> abt '[] HProb -> abt '[] HProb
+ Language.Hakaru.Syntax.Prelude: betaFunc :: (ABT Term abt) => abt '[] 'HProb -> abt '[] 'HProb -> abt '[] 'HProb
- Language.Hakaru.Syntax.Prelude: bindx :: (ABT Term abt, SingI a, SingI b) => abt '[] (HMeasure a) -> (abt '[] a -> abt '[] (HMeasure b)) -> abt '[] (HMeasure (HPair a b))
+ Language.Hakaru.Syntax.Prelude: bindx :: (ABT Term abt, SingI a, SingI b) => abt '[] ( 'HMeasure a) -> (abt '[] a -> abt '[] ( 'HMeasure b)) -> abt '[] ( 'HMeasure (HPair a b))
- Language.Hakaru.Syntax.Prelude: binomial :: (ABT Term abt) => abt '[] HNat -> abt '[] HProb -> abt '[] (HMeasure HInt)
+ Language.Hakaru.Syntax.Prelude: binomial :: (ABT Term abt) => abt '[] 'HNat -> abt '[] 'HProb -> abt '[] ( 'HMeasure 'HInt)
- Language.Hakaru.Syntax.Prelude: bucket :: (ABT Term abt) => abt '[] HNat -> abt '[] HNat -> Reducer abt '[] a -> abt '[] a
+ Language.Hakaru.Syntax.Prelude: bucket :: (ABT Term abt) => abt '[] 'HNat -> abt '[] 'HNat -> Reducer abt '[] a -> abt '[] a
- Language.Hakaru.Syntax.Prelude: categorical :: (ABT Term abt) => abt '[] (HArray HProb) -> abt '[] (HMeasure HNat)
+ Language.Hakaru.Syntax.Prelude: categorical :: (ABT Term abt) => abt '[] ( 'HArray 'HProb) -> abt '[] ( 'HMeasure 'HNat)
- Language.Hakaru.Syntax.Prelude: categorical' :: (ABT Term abt) => abt '[] (HArray HProb) -> abt '[] (HMeasure HNat)
+ Language.Hakaru.Syntax.Prelude: categorical' :: (ABT Term abt) => abt '[] ( 'HArray 'HProb) -> abt '[] ( 'HMeasure 'HNat)
- Language.Hakaru.Syntax.Prelude: cauchy :: (ABT Term abt) => abt '[] HReal -> abt '[] HProb -> abt '[] (HMeasure HReal)
+ Language.Hakaru.Syntax.Prelude: cauchy :: (ABT Term abt) => abt '[] 'HReal -> abt '[] 'HProb -> abt '[] ( 'HMeasure 'HReal)
- Language.Hakaru.Syntax.Prelude: chain :: (ABT Term abt, SingI s) => abt '[] HNat -> abt '[] s -> (abt '[] s -> abt '[] (HMeasure (HPair a s))) -> abt '[] (HMeasure (HPair (HArray a) s))
+ Language.Hakaru.Syntax.Prelude: chain :: (ABT Term abt, SingI s) => abt '[] 'HNat -> abt '[] s -> (abt '[] s -> abt '[] ( 'HMeasure (HPair a s))) -> abt '[] ( 'HMeasure (HPair ( 'HArray a) s))
- Language.Hakaru.Syntax.Prelude: chain' :: (ABT Term abt, SingI s, SingI a) => abt '[] (HArray (s :-> HMeasure (HPair a s))) -> abt '[] s -> abt '[] (HMeasure (HPair (HArray a) s))
+ Language.Hakaru.Syntax.Prelude: chain' :: (ABT Term abt, SingI s, SingI a) => abt '[] ( 'HArray (s :-> 'HMeasure (HPair a s))) -> abt '[] s -> abt '[] ( 'HMeasure (HPair ( 'HArray a) s))
- Language.Hakaru.Syntax.Prelude: chi2 :: (ABT Term abt) => abt '[] HProb -> abt '[] (HMeasure HProb)
+ Language.Hakaru.Syntax.Prelude: chi2 :: (ABT Term abt) => abt '[] 'HProb -> abt '[] ( 'HMeasure 'HProb)
- Language.Hakaru.Syntax.Prelude: constV :: (ABT Term abt) => abt '[] HNat -> abt '[] b -> abt '[] (HArray b)
+ Language.Hakaru.Syntax.Prelude: constV :: (ABT Term abt) => abt '[] 'HNat -> abt '[] b -> abt '[] ( 'HArray b)
- Language.Hakaru.Syntax.Prelude: cos :: (ABT Term abt) => abt '[] HReal -> abt '[] HReal
+ Language.Hakaru.Syntax.Prelude: cos :: (ABT Term abt) => abt '[] 'HReal -> abt '[] 'HReal
- Language.Hakaru.Syntax.Prelude: cosh :: (ABT Term abt) => abt '[] HReal -> abt '[] HReal
+ Language.Hakaru.Syntax.Prelude: cosh :: (ABT Term abt) => abt '[] 'HReal -> abt '[] 'HReal
- Language.Hakaru.Syntax.Prelude: counting :: (ABT Term abt) => abt '[] (HMeasure HInt)
+ Language.Hakaru.Syntax.Prelude: counting :: (ABT Term abt) => abt '[] ( 'HMeasure 'HInt)
- Language.Hakaru.Syntax.Prelude: densityBeta :: (ABT Term abt) => abt '[] HProb -> abt '[] HProb -> abt '[] HProb -> abt '[] HProb
+ Language.Hakaru.Syntax.Prelude: densityBeta :: (ABT Term abt) => abt '[] 'HProb -> abt '[] 'HProb -> abt '[] 'HProb -> abt '[] 'HProb
- Language.Hakaru.Syntax.Prelude: densityCategorical :: (ABT Term abt) => abt '[] (HArray HProb) -> abt '[] HNat -> abt '[] HProb
+ Language.Hakaru.Syntax.Prelude: densityCategorical :: (ABT Term abt) => abt '[] ( 'HArray 'HProb) -> abt '[] 'HNat -> abt '[] 'HProb
- Language.Hakaru.Syntax.Prelude: densityGamma :: (ABT Term abt) => abt '[] HProb -> abt '[] HProb -> abt '[] HProb -> abt '[] HProb
+ Language.Hakaru.Syntax.Prelude: densityGamma :: (ABT Term abt) => abt '[] 'HProb -> abt '[] 'HProb -> abt '[] 'HProb -> abt '[] 'HProb
- Language.Hakaru.Syntax.Prelude: densityNormal :: (ABT Term abt) => abt '[] HReal -> abt '[] HProb -> abt '[] HReal -> abt '[] HProb
+ Language.Hakaru.Syntax.Prelude: densityNormal :: (ABT Term abt) => abt '[] 'HReal -> abt '[] 'HProb -> abt '[] 'HReal -> abt '[] 'HProb
- Language.Hakaru.Syntax.Prelude: densityPoisson :: (ABT Term abt) => abt '[] HProb -> abt '[] HNat -> abt '[] HProb
+ Language.Hakaru.Syntax.Prelude: densityPoisson :: (ABT Term abt) => abt '[] 'HProb -> abt '[] 'HNat -> abt '[] 'HProb
- Language.Hakaru.Syntax.Prelude: densityUniform :: (ABT Term abt) => abt '[] HReal -> abt '[] HReal -> abt '[] HReal -> abt '[] HProb
+ Language.Hakaru.Syntax.Prelude: densityUniform :: (ABT Term abt) => abt '[] 'HReal -> abt '[] 'HReal -> abt '[] 'HReal -> abt '[] 'HProb
- Language.Hakaru.Syntax.Prelude: dirac :: (ABT Term abt) => abt '[] a -> abt '[] (HMeasure a)
+ Language.Hakaru.Syntax.Prelude: dirac :: (ABT Term abt) => abt '[] a -> abt '[] ( 'HMeasure a)
- Language.Hakaru.Syntax.Prelude: dirichlet :: (ABT Term abt) => abt '[] (HArray HProb) -> abt '[] (HMeasure (HArray HProb))
+ Language.Hakaru.Syntax.Prelude: dirichlet :: (ABT Term abt) => abt '[] ( 'HArray 'HProb) -> abt '[] ( 'HMeasure ( 'HArray 'HProb))
- Language.Hakaru.Syntax.Prelude: empty :: (ABT Term abt, SingI a) => abt '[] (HArray a)
+ Language.Hakaru.Syntax.Prelude: empty :: (ABT Term abt, SingI a) => abt '[] ( 'HArray a)
- Language.Hakaru.Syntax.Prelude: erf :: (RealProb a, ABT Term abt) => abt '[] a -> abt '[] a
+ Language.Hakaru.Syntax.Prelude: erf :: (RealProb a, (ABT Term abt)) => abt '[] a -> abt '[] a
- Language.Hakaru.Syntax.Prelude: exp :: (RealProb a, ABT Term abt) => abt '[] a -> abt '[] HProb
+ Language.Hakaru.Syntax.Prelude: exp :: (RealProb a, (ABT Term abt)) => abt '[] a -> abt '[] 'HProb
- Language.Hakaru.Syntax.Prelude: exponential :: (ABT Term abt) => abt '[] HProb -> abt '[] (HMeasure HProb)
+ Language.Hakaru.Syntax.Prelude: exponential :: (ABT Term abt) => abt '[] 'HProb -> abt '[] ( 'HMeasure 'HProb)
- Language.Hakaru.Syntax.Prelude: fromInt :: (ABT Term abt) => abt '[] HInt -> abt '[] HReal
+ Language.Hakaru.Syntax.Prelude: fromInt :: (ABT Term abt) => abt '[] 'HInt -> abt '[] 'HReal
- Language.Hakaru.Syntax.Prelude: fromProb :: (ABT Term abt) => abt '[] HProb -> abt '[] HReal
+ Language.Hakaru.Syntax.Prelude: fromProb :: (ABT Term abt) => abt '[] 'HProb -> abt '[] 'HReal
- Language.Hakaru.Syntax.Prelude: gamma :: (ABT Term abt) => abt '[] HProb -> abt '[] HProb -> abt '[] (HMeasure HProb)
+ Language.Hakaru.Syntax.Prelude: gamma :: (ABT Term abt) => abt '[] 'HProb -> abt '[] 'HProb -> abt '[] ( 'HMeasure 'HProb)
- Language.Hakaru.Syntax.Prelude: gamma' :: (ABT Term abt) => abt '[] HProb -> abt '[] HProb -> abt '[] (HMeasure HProb)
+ Language.Hakaru.Syntax.Prelude: gamma' :: (ABT Term abt) => abt '[] 'HProb -> abt '[] 'HProb -> abt '[] ( 'HMeasure 'HProb)
- Language.Hakaru.Syntax.Prelude: gammaFunc :: (RealProb a, ABT Term abt) => abt '[] a -> abt '[] HProb
+ Language.Hakaru.Syntax.Prelude: gammaFunc :: (RealProb a, (ABT Term abt)) => abt '[] a -> abt '[] 'HProb
- Language.Hakaru.Syntax.Prelude: geometric :: (ABT Term abt) => abt '[] HProb -> abt '[] (HMeasure HNat)
+ Language.Hakaru.Syntax.Prelude: geometric :: (ABT Term abt) => abt '[] 'HProb -> abt '[] ( 'HMeasure 'HNat)
- Language.Hakaru.Syntax.Prelude: guard :: (ABT Term abt) => abt '[] HBool -> abt '[] (HMeasure HUnit)
+ Language.Hakaru.Syntax.Prelude: guard :: (ABT Term abt) => abt '[] HBool -> abt '[] ( 'HMeasure HUnit)
- Language.Hakaru.Syntax.Prelude: infinity :: (Integrable a, ABT Term abt) => abt '[] a
+ Language.Hakaru.Syntax.Prelude: infinity :: (Integrable a, (ABT Term abt)) => abt '[] a
- Language.Hakaru.Syntax.Prelude: int_ :: (ABT Term abt) => Integer -> abt '[] HInt
+ Language.Hakaru.Syntax.Prelude: int_ :: (ABT Term abt) => Integer -> abt '[] 'HInt
- Language.Hakaru.Syntax.Prelude: integrate :: (ABT Term abt) => abt '[] HReal -> abt '[] HReal -> (abt '[] HReal -> abt '[] HProb) -> abt '[] HProb
+ Language.Hakaru.Syntax.Prelude: integrate :: (ABT Term abt) => abt '[] 'HReal -> abt '[] 'HReal -> (abt '[] 'HReal -> abt '[] 'HProb) -> abt '[] 'HProb
- Language.Hakaru.Syntax.Prelude: invgamma :: (ABT Term abt) => abt '[] HProb -> abt '[] HProb -> abt '[] (HMeasure HProb)
+ Language.Hakaru.Syntax.Prelude: invgamma :: (ABT Term abt) => abt '[] 'HProb -> abt '[] 'HProb -> abt '[] ( 'HMeasure 'HProb)
- Language.Hakaru.Syntax.Prelude: laplace :: (ABT Term abt) => abt '[] HReal -> abt '[] HProb -> abt '[] (HMeasure HReal)
+ Language.Hakaru.Syntax.Prelude: laplace :: (ABT Term abt) => abt '[] 'HReal -> abt '[] 'HProb -> abt '[] ( 'HMeasure 'HReal)
- Language.Hakaru.Syntax.Prelude: lebesgue :: (ABT Term abt) => abt '[] (HMeasure HReal)
+ Language.Hakaru.Syntax.Prelude: lebesgue :: (ABT Term abt) => abt '[] ( 'HMeasure 'HReal)
- Language.Hakaru.Syntax.Prelude: liftM2 :: (ABT Term abt, SingI a, SingI b) => (abt '[] a -> abt '[] b -> abt '[] c) -> abt '[] (HMeasure a) -> abt '[] (HMeasure b) -> abt '[] (HMeasure c)
+ Language.Hakaru.Syntax.Prelude: liftM2 :: (ABT Term abt, SingI a, SingI b) => (abt '[] a -> abt '[] b -> abt '[] c) -> abt '[] ( 'HMeasure a) -> abt '[] ( 'HMeasure b) -> abt '[] ( 'HMeasure c)
- Language.Hakaru.Syntax.Prelude: log :: (ABT Term abt) => abt '[] HProb -> abt '[] HReal
+ Language.Hakaru.Syntax.Prelude: log :: (ABT Term abt) => abt '[] 'HProb -> abt '[] 'HReal
- Language.Hakaru.Syntax.Prelude: logBase :: (ABT Term abt) => abt '[] HProb -> abt '[] HProb -> abt '[] HReal
+ Language.Hakaru.Syntax.Prelude: logBase :: (ABT Term abt) => abt '[] 'HProb -> abt '[] 'HProb -> abt '[] 'HReal
- Language.Hakaru.Syntax.Prelude: mapV :: (ABT Term abt) => (abt '[] a -> abt '[] b) -> abt '[] (HArray a) -> abt '[] (HArray b)
+ Language.Hakaru.Syntax.Prelude: mapV :: (ABT Term abt) => (abt '[] a -> abt '[] b) -> abt '[] ( 'HArray a) -> abt '[] ( 'HArray b)
- Language.Hakaru.Syntax.Prelude: mapWithIndex :: (ABT Term abt) => (abt '[] HNat -> abt '[] a -> abt '[] b) -> abt '[] (HArray a) -> abt '[] (HArray b)
+ Language.Hakaru.Syntax.Prelude: mapWithIndex :: (ABT Term abt) => (abt '[] 'HNat -> abt '[] a -> abt '[] b) -> abt '[] ( 'HArray a) -> abt '[] ( 'HArray b)
- Language.Hakaru.Syntax.Prelude: measure0_ :: (ABT Term abt) => MeasureOp '[] a -> abt '[] (HMeasure a)
+ Language.Hakaru.Syntax.Prelude: measure0_ :: (ABT Term abt) => MeasureOp '[] a -> abt '[] ( 'HMeasure a)
- Language.Hakaru.Syntax.Prelude: measure1_ :: (ABT Term abt) => MeasureOp '[a] b -> abt '[] a -> abt '[] (HMeasure b)
+ Language.Hakaru.Syntax.Prelude: measure1_ :: (ABT Term abt) => MeasureOp '[a] b -> abt '[] a -> abt '[] ( 'HMeasure b)
- Language.Hakaru.Syntax.Prelude: measure2_ :: (ABT Term abt) => MeasureOp '[a, b] c -> abt '[] a -> abt '[] b -> abt '[] (HMeasure c)
+ Language.Hakaru.Syntax.Prelude: measure2_ :: (ABT Term abt) => MeasureOp '[a, b] c -> abt '[] a -> abt '[] b -> abt '[] ( 'HMeasure c)
- Language.Hakaru.Syntax.Prelude: mix :: (ABT Term abt) => abt '[] (HArray HProb) -> abt '[] (HMeasure HNat)
+ Language.Hakaru.Syntax.Prelude: mix :: (ABT Term abt) => abt '[] ( 'HArray 'HProb) -> abt '[] ( 'HMeasure 'HNat)
- Language.Hakaru.Syntax.Prelude: multinomial :: (ABT Term abt) => abt '[] HNat -> abt '[] (HArray HProb) -> abt '[] (HMeasure (HArray HProb))
+ Language.Hakaru.Syntax.Prelude: multinomial :: (ABT Term abt) => abt '[] 'HNat -> abt '[] ( 'HArray 'HProb) -> abt '[] ( 'HMeasure ( 'HArray 'HProb))
- Language.Hakaru.Syntax.Prelude: nat2int :: (ABT Term abt) => abt '[] HNat -> abt '[] HInt
+ Language.Hakaru.Syntax.Prelude: nat2int :: (ABT Term abt) => abt '[] 'HNat -> abt '[] 'HInt
- Language.Hakaru.Syntax.Prelude: nat2prob :: (ABT Term abt) => abt '[] HNat -> abt '[] HProb
+ Language.Hakaru.Syntax.Prelude: nat2prob :: (ABT Term abt) => abt '[] 'HNat -> abt '[] 'HProb
- Language.Hakaru.Syntax.Prelude: nat2real :: (ABT Term abt) => abt '[] HNat -> abt '[] HReal
+ Language.Hakaru.Syntax.Prelude: nat2real :: (ABT Term abt) => abt '[] 'HNat -> abt '[] 'HReal
- Language.Hakaru.Syntax.Prelude: nat_ :: (ABT Term abt) => Natural -> abt '[] HNat
+ Language.Hakaru.Syntax.Prelude: nat_ :: (ABT Term abt) => Natural -> abt '[] 'HNat
- Language.Hakaru.Syntax.Prelude: negativeBinomial :: (ABT Term abt) => abt '[] HNat -> abt '[] HProb -> abt '[] (HMeasure HNat)
+ Language.Hakaru.Syntax.Prelude: negativeBinomial :: (ABT Term abt) => abt '[] 'HNat -> abt '[] 'HProb -> abt '[] ( 'HMeasure 'HNat)
- Language.Hakaru.Syntax.Prelude: normal :: (ABT Term abt) => abt '[] HReal -> abt '[] HProb -> abt '[] (HMeasure HReal)
+ Language.Hakaru.Syntax.Prelude: normal :: (ABT Term abt) => abt '[] 'HReal -> abt '[] 'HProb -> abt '[] ( 'HMeasure 'HReal)
- Language.Hakaru.Syntax.Prelude: normal' :: (ABT Term abt) => abt '[] HReal -> abt '[] HProb -> abt '[] (HMeasure HReal)
+ Language.Hakaru.Syntax.Prelude: normal' :: (ABT Term abt) => abt '[] 'HReal -> abt '[] 'HProb -> abt '[] ( 'HMeasure 'HReal)
- Language.Hakaru.Syntax.Prelude: normalizeV :: (ABT Term abt) => abt '[] (HArray HProb) -> abt '[] (HArray HProb)
+ Language.Hakaru.Syntax.Prelude: normalizeV :: (ABT Term abt) => abt '[] ( 'HArray 'HProb) -> abt '[] ( 'HArray 'HProb)
- Language.Hakaru.Syntax.Prelude: pi :: (RealProb a, ABT Term abt) => abt '[] a
+ Language.Hakaru.Syntax.Prelude: pi :: (RealProb a, (ABT Term abt)) => abt '[] a
- Language.Hakaru.Syntax.Prelude: plate :: (ABT Term abt) => abt '[] HNat -> (abt '[] HNat -> abt '[] (HMeasure a)) -> abt '[] (HMeasure (HArray a))
+ Language.Hakaru.Syntax.Prelude: plate :: (ABT Term abt) => abt '[] 'HNat -> (abt '[] 'HNat -> abt '[] ( 'HMeasure a)) -> abt '[] ( 'HMeasure ( 'HArray a))
- Language.Hakaru.Syntax.Prelude: plate' :: (ABT Term abt, SingI a) => abt '[] (HArray (HMeasure a)) -> abt '[] (HMeasure (HArray a))
+ Language.Hakaru.Syntax.Prelude: plate' :: (ABT Term abt, SingI a) => abt '[] ( 'HArray ( 'HMeasure a)) -> abt '[] ( 'HMeasure ( 'HArray a))
- Language.Hakaru.Syntax.Prelude: plateWithVar :: (ABT Term abt) => abt '[] HNat -> Variable HNat -> abt '[] (HMeasure a) -> abt '[] (HMeasure (HArray a))
+ Language.Hakaru.Syntax.Prelude: plateWithVar :: (ABT Term abt) => abt '[] 'HNat -> Variable 'HNat -> abt '[] ( 'HMeasure a) -> abt '[] ( 'HMeasure ( 'HArray a))
- Language.Hakaru.Syntax.Prelude: poisson :: (ABT Term abt) => abt '[] HProb -> abt '[] (HMeasure HNat)
+ Language.Hakaru.Syntax.Prelude: poisson :: (ABT Term abt) => abt '[] 'HProb -> abt '[] ( 'HMeasure 'HNat)
- Language.Hakaru.Syntax.Prelude: poisson' :: (ABT Term abt) => abt '[] HProb -> abt '[] (HMeasure HNat)
+ Language.Hakaru.Syntax.Prelude: poisson' :: (ABT Term abt) => abt '[] 'HProb -> abt '[] ( 'HMeasure 'HNat)
- Language.Hakaru.Syntax.Prelude: prob_ :: (ABT Term abt) => NonNegativeRational -> abt '[] HProb
+ Language.Hakaru.Syntax.Prelude: prob_ :: (ABT Term abt) => NonNegativeRational -> abt '[] 'HProb
- Language.Hakaru.Syntax.Prelude: r_add :: (Binders Term abt xs as, HSemiring_ a) => ((abt '[] HNat, as) -> abt '[] a) -> Reducer abt xs a
+ Language.Hakaru.Syntax.Prelude: r_add :: (Binders Term abt xs as, HSemiring_ a) => ((abt '[] 'HNat, as) -> abt '[] a) -> Reducer abt xs a
- Language.Hakaru.Syntax.Prelude: r_index :: (Binders Term abt xs as) => (as -> abt '[] HNat) -> ((abt '[] HNat, as) -> abt '[] HNat) -> Reducer abt (HNat : xs) a -> Reducer abt xs (HArray a)
+ Language.Hakaru.Syntax.Prelude: r_index :: (Binders Term abt xs as) => (as -> abt '[] 'HNat) -> ((abt '[] 'HNat, as) -> abt '[] 'HNat) -> Reducer abt ( 'HNat : xs) a -> Reducer abt xs ( 'HArray a)
- Language.Hakaru.Syntax.Prelude: r_split :: (Binders Term abt xs as) => ((abt '[] HNat, as) -> abt '[] HBool) -> Reducer abt xs a -> Reducer abt xs b -> Reducer abt xs (HPair a b)
+ Language.Hakaru.Syntax.Prelude: r_split :: (Binders Term abt xs as) => ((abt '[] 'HNat, as) -> abt '[] HBool) -> Reducer abt xs a -> Reducer abt xs b -> Reducer abt xs (HPair a b)
- Language.Hakaru.Syntax.Prelude: real_ :: (ABT Term abt) => Rational -> abt '[] HReal
+ Language.Hakaru.Syntax.Prelude: real_ :: (ABT Term abt) => Rational -> abt '[] 'HReal
- Language.Hakaru.Syntax.Prelude: reduce :: (ABT Term abt) => (abt '[] a -> abt '[] a -> abt '[] a) -> abt '[] a -> abt '[] (HArray a) -> abt '[] a
+ Language.Hakaru.Syntax.Prelude: reduce :: (ABT Term abt) => (abt '[] a -> abt '[] a -> abt '[] a) -> abt '[] a -> abt '[] ( 'HArray a) -> abt '[] a
- Language.Hakaru.Syntax.Prelude: reject :: (ABT Term abt) => (Sing (HMeasure a)) -> abt '[] (HMeasure a)
+ Language.Hakaru.Syntax.Prelude: reject :: (ABT Term abt) => (Sing ( 'HMeasure a)) -> abt '[] ( 'HMeasure a)
- Language.Hakaru.Syntax.Prelude: sin :: (ABT Term abt) => abt '[] HReal -> abt '[] HReal
+ Language.Hakaru.Syntax.Prelude: sin :: (ABT Term abt) => abt '[] 'HReal -> abt '[] 'HReal
- Language.Hakaru.Syntax.Prelude: sinh :: (ABT Term abt) => abt '[] HReal -> abt '[] HReal
+ Language.Hakaru.Syntax.Prelude: sinh :: (ABT Term abt) => abt '[] 'HReal -> abt '[] 'HReal
- Language.Hakaru.Syntax.Prelude: size :: (ABT Term abt) => abt '[] (HArray a) -> abt '[] HNat
+ Language.Hakaru.Syntax.Prelude: size :: (ABT Term abt) => abt '[] ( 'HArray a) -> abt '[] 'HNat
- Language.Hakaru.Syntax.Prelude: studentT :: (ABT Term abt) => abt '[] HReal -> abt '[] HProb -> abt '[] HProb -> abt '[] (HMeasure HReal)
+ Language.Hakaru.Syntax.Prelude: studentT :: (ABT Term abt) => abt '[] 'HReal -> abt '[] 'HProb -> abt '[] 'HProb -> abt '[] ( 'HMeasure 'HReal)
- Language.Hakaru.Syntax.Prelude: sumV :: (ABT Term abt, HSemiring_ a) => abt '[] (HArray a) -> abt '[] a
+ Language.Hakaru.Syntax.Prelude: sumV :: (ABT Term abt, HSemiring_ a) => abt '[] ( 'HArray a) -> abt '[] a
- Language.Hakaru.Syntax.Prelude: summateV :: (ABT Term abt) => abt '[] (HArray HProb) -> abt '[] HProb
+ Language.Hakaru.Syntax.Prelude: summateV :: (ABT Term abt) => abt '[] ( 'HArray 'HProb) -> abt '[] 'HProb
- Language.Hakaru.Syntax.Prelude: superpose :: (ABT Term abt) => NonEmpty (abt '[] HProb, abt '[] (HMeasure a)) -> abt '[] (HMeasure a)
+ Language.Hakaru.Syntax.Prelude: superpose :: (ABT Term abt) => NonEmpty (abt '[] 'HProb, abt '[] ( 'HMeasure a)) -> abt '[] ( 'HMeasure a)
- Language.Hakaru.Syntax.Prelude: tan :: (ABT Term abt) => abt '[] HReal -> abt '[] HReal
+ Language.Hakaru.Syntax.Prelude: tan :: (ABT Term abt) => abt '[] 'HReal -> abt '[] 'HReal
- Language.Hakaru.Syntax.Prelude: tanh :: (ABT Term abt) => abt '[] HReal -> abt '[] HReal
+ Language.Hakaru.Syntax.Prelude: tanh :: (ABT Term abt) => abt '[] 'HReal -> abt '[] 'HReal
- Language.Hakaru.Syntax.Prelude: thRootOf :: (ABT Term abt, HRadical_ a) => abt '[] HNat -> abt '[] a -> abt '[] a
+ Language.Hakaru.Syntax.Prelude: thRootOf :: (ABT Term abt, HRadical_ a) => abt '[] 'HNat -> abt '[] a -> abt '[] a
- Language.Hakaru.Syntax.Prelude: uniform :: (ABT Term abt) => abt '[] HReal -> abt '[] HReal -> abt '[] (HMeasure HReal)
+ Language.Hakaru.Syntax.Prelude: uniform :: (ABT Term abt) => abt '[] 'HReal -> abt '[] 'HReal -> abt '[] ( 'HMeasure 'HReal)
- Language.Hakaru.Syntax.Prelude: uniform' :: (ABT Term abt) => abt '[] HReal -> abt '[] HReal -> abt '[] (HMeasure HReal)
+ Language.Hakaru.Syntax.Prelude: uniform' :: (ABT Term abt) => abt '[] 'HReal -> abt '[] 'HReal -> abt '[] ( 'HMeasure 'HReal)
- Language.Hakaru.Syntax.Prelude: unitV :: (ABT Term abt) => abt '[] HNat -> abt '[] HNat -> abt '[] (HArray HProb)
+ Language.Hakaru.Syntax.Prelude: unitV :: (ABT Term abt) => abt '[] 'HNat -> abt '[] 'HNat -> abt '[] ( 'HArray 'HProb)
- Language.Hakaru.Syntax.Prelude: unsafeMinusNat :: (ABT Term abt) => abt '[] HNat -> abt '[] HNat -> abt '[] HNat
+ Language.Hakaru.Syntax.Prelude: unsafeMinusNat :: (ABT Term abt) => abt '[] 'HNat -> abt '[] 'HNat -> abt '[] 'HNat
- Language.Hakaru.Syntax.Prelude: unsafeMinusProb :: (ABT Term abt) => abt '[] HProb -> abt '[] HProb -> abt '[] HProb
+ Language.Hakaru.Syntax.Prelude: unsafeMinusProb :: (ABT Term abt) => abt '[] 'HProb -> abt '[] 'HProb -> abt '[] 'HProb
- Language.Hakaru.Syntax.Prelude: unsafeProb :: (ABT Term abt) => abt '[] HReal -> abt '[] HProb
+ Language.Hakaru.Syntax.Prelude: unsafeProb :: (ABT Term abt) => abt '[] 'HReal -> abt '[] 'HProb
- Language.Hakaru.Syntax.Prelude: unsafeProbFraction :: forall abt a. (ABT Term abt, HFractional_ a) => abt '[] a -> abt '[] HProb
+ Language.Hakaru.Syntax.Prelude: unsafeProbFraction :: forall abt a. (ABT Term abt, HFractional_ a) => abt '[] a -> abt '[] 'HProb
- Language.Hakaru.Syntax.Prelude: unsafeProbFraction_ :: (ABT Term abt) => HFractional a -> abt '[] a -> abt '[] HProb
+ Language.Hakaru.Syntax.Prelude: unsafeProbFraction_ :: (ABT Term abt) => HFractional a -> abt '[] a -> abt '[] 'HProb
- Language.Hakaru.Syntax.Prelude: unsafeProbSemiring :: forall abt a. (ABT Term abt, HSemiring_ a) => abt '[] a -> abt '[] HProb
+ Language.Hakaru.Syntax.Prelude: unsafeProbSemiring :: forall abt a. (ABT Term abt, HSemiring_ a) => abt '[] a -> abt '[] 'HProb
- Language.Hakaru.Syntax.Prelude: unsafeProbSemiring_ :: (ABT Term abt) => HSemiring a -> abt '[] a -> abt '[] HProb
+ Language.Hakaru.Syntax.Prelude: unsafeProbSemiring_ :: (ABT Term abt) => HSemiring a -> abt '[] a -> abt '[] 'HProb
- Language.Hakaru.Syntax.Prelude: weibull :: (ABT Term abt) => abt '[] HProb -> abt '[] HProb -> abt '[] (HMeasure HProb)
+ Language.Hakaru.Syntax.Prelude: weibull :: (ABT Term abt) => abt '[] 'HProb -> abt '[] 'HProb -> abt '[] ( 'HMeasure 'HProb)
- Language.Hakaru.Syntax.Prelude: weight :: (ABT Term abt) => abt '[] HProb -> abt '[] (HMeasure HUnit)
+ Language.Hakaru.Syntax.Prelude: weight :: (ABT Term abt) => abt '[] 'HProb -> abt '[] ( 'HMeasure HUnit)
- Language.Hakaru.Syntax.Prelude: weightedDirac :: (ABT Term abt, SingI a) => abt '[] a -> abt '[] HProb -> abt '[] (HMeasure a)
+ Language.Hakaru.Syntax.Prelude: weightedDirac :: (ABT Term abt, SingI a) => abt '[] a -> abt '[] 'HProb -> abt '[] ( 'HMeasure a)
- Language.Hakaru.Syntax.Prelude: withGuard :: (ABT Term abt) => abt '[] HBool -> abt '[] (HMeasure a) -> abt '[] (HMeasure a)
+ Language.Hakaru.Syntax.Prelude: withGuard :: (ABT Term abt) => abt '[] HBool -> abt '[] ( 'HMeasure a) -> abt '[] ( 'HMeasure a)
- Language.Hakaru.Syntax.Prelude: withWeight :: (ABT Term abt) => abt '[] HProb -> abt '[] (HMeasure w) -> abt '[] (HMeasure w)
+ Language.Hakaru.Syntax.Prelude: withWeight :: (ABT Term abt) => abt '[] 'HProb -> abt '[] ( 'HMeasure w) -> abt '[] ( 'HMeasure w)
- Language.Hakaru.Syntax.Prelude: zipWithV :: (ABT Term abt) => (abt '[] a -> abt '[] b -> abt '[] c) -> abt '[] (HArray a) -> abt '[] (HArray b) -> abt '[] (HArray c)
+ Language.Hakaru.Syntax.Prelude: zipWithV :: (ABT Term abt) => (abt '[] a -> abt '[] b -> abt '[] c) -> abt '[] ( 'HArray a) -> abt '[] ( 'HArray b) -> abt '[] ( 'HArray c)
- Language.Hakaru.Syntax.Reducer: [Red_Add] :: HSemiring a -> abt (HNat : xs) a -> Reducer abt xs a
+ Language.Hakaru.Syntax.Reducer: [Red_Add] :: HSemiring a -> abt ( 'HNat : xs) a -> Reducer abt xs a
- Language.Hakaru.Syntax.Reducer: [Red_Index] :: abt xs HNat -> abt (HNat : xs) HNat -> Reducer abt (HNat : xs) a -> Reducer abt xs (HArray a)
+ Language.Hakaru.Syntax.Reducer: [Red_Index] :: abt xs 'HNat -> abt ( 'HNat : xs) 'HNat -> Reducer abt ( 'HNat : xs) a -> Reducer abt xs ( 'HArray a)
- Language.Hakaru.Syntax.Reducer: [Red_Split] :: abt (HNat : xs) HBool -> Reducer abt xs a -> Reducer abt xs b -> Reducer abt xs (HPair a b)
+ Language.Hakaru.Syntax.Reducer: [Red_Split] :: abt ( 'HNat : xs) HBool -> Reducer abt xs a -> Reducer abt xs b -> Reducer abt xs (HPair a b)
- Language.Hakaru.Syntax.Value: [VArray] :: {-# UNPACK #-} !(Vector (Value a)) -> Value (HArray a)
+ Language.Hakaru.Syntax.Value: [VArray] :: {-# UNPACK #-} !(Vector (Value a)) -> Value ( 'HArray a)
- Language.Hakaru.Syntax.Value: [VInt] :: {-# UNPACK #-} !Int -> Value HInt
+ Language.Hakaru.Syntax.Value: [VInt] :: !Integer -> Value 'HInt
- Language.Hakaru.Syntax.Value: [VMeasure] :: (Value HProb -> GenIO -> IO (Maybe (Value a, Value HProb))) -> Value (HMeasure a)
+ Language.Hakaru.Syntax.Value: [VMeasure] :: (Value 'HProb -> GenIO -> IO (Maybe (Value a, Value 'HProb))) -> Value ( 'HMeasure a)
- Language.Hakaru.Syntax.Value: [VNat] :: {-# UNPACK #-} !Nat -> Value HNat
+ Language.Hakaru.Syntax.Value: [VNat] :: !Natural -> Value 'HNat
- Language.Hakaru.Syntax.Value: [VProb] :: {-# UNPACK #-} !LogFloat -> Value HProb
+ Language.Hakaru.Syntax.Value: [VProb] :: {-# UNPACK #-} !LogFloat -> Value 'HProb
- Language.Hakaru.Syntax.Value: [VReal] :: {-# UNPACK #-} !Double -> Value HReal
+ Language.Hakaru.Syntax.Value: [VReal] :: {-# UNPACK #-} !Double -> Value 'HReal
- Language.Hakaru.Syntax.Value: [VRed_Array] :: Vector (VReducer s a) -> VReducer s (HArray a)
+ Language.Hakaru.Syntax.Value: [VRed_Array] :: Vector (VReducer s a) -> VReducer s ( 'HArray a)
- Language.Hakaru.Syntax.Value: lam2 :: Value (a :-> (b :-> c)) -> (Value a -> Value b -> Value c)
+ Language.Hakaru.Syntax.Value: lam2 :: Value (a :-> b :-> c) -> (Value a -> Value b -> Value c)
- Language.Hakaru.Syntax.Variable: type KindOf (a :: k) = (KProxy :: KProxy k)
+ Language.Hakaru.Syntax.Variable: type KindOf (a :: k) = ( 'KProxy :: KProxy k)
- Language.Hakaru.Types.DataKind: data Symbol :: *
+ Language.Hakaru.Types.DataKind: data Symbol
- Language.Hakaru.Types.DataKind: type HBool = HData (TyCon "Bool") '['[], '[]]
+ Language.Hakaru.Types.DataKind: type HBool = 'HData ( 'TyCon "Bool") '['[], '[]]
- Language.Hakaru.Types.DataKind: type HData' t = HData t (Code t)
+ Language.Hakaru.Types.DataKind: type HData' t = 'HData t (Code t)
- Language.Hakaru.Types.DataKind: type HEither a b = HData ((TyCon "Either" :@ a) :@ b) '['[K a], '[K b]]
+ Language.Hakaru.Types.DataKind: type HEither a b = 'HData ( 'TyCon "Either" :@ a :@ b) '['[ 'K a], '[ 'K b]]
- Language.Hakaru.Types.DataKind: type HList a = HData (TyCon "List" :@ a) '['[], '[K a, I]]
+ Language.Hakaru.Types.DataKind: type HList a = 'HData ( 'TyCon "List" :@ a) '['[], '[ 'K a, 'I]]
- Language.Hakaru.Types.DataKind: type HMaybe a = HData (TyCon "Maybe" :@ a) '['[], '[K a]]
+ Language.Hakaru.Types.DataKind: type HMaybe a = 'HData ( 'TyCon "Maybe" :@ a) '['[], '[ 'K a]]
- Language.Hakaru.Types.DataKind: type HPair a b = HData ((TyCon "Pair" :@ a) :@ b) '['[K a, K b]]
+ Language.Hakaru.Types.DataKind: type HPair a b = 'HData ( 'TyCon "Pair" :@ a :@ b) '['[ 'K a, 'K b]]
- Language.Hakaru.Types.DataKind: type HUnit = HData (TyCon "Unit") '['[]]
+ Language.Hakaru.Types.DataKind: type HUnit = 'HData ( 'TyCon "Unit") '['[]]
- Language.Hakaru.Types.HClasses: [HContinuous_Prob] :: HContinuous HProb
+ Language.Hakaru.Types.HClasses: [HContinuous_Prob] :: HContinuous 'HProb
- Language.Hakaru.Types.HClasses: [HContinuous_Real] :: HContinuous HReal
+ Language.Hakaru.Types.HClasses: [HContinuous_Real] :: HContinuous 'HReal
- Language.Hakaru.Types.HClasses: [HDiscrete_Int] :: HDiscrete HInt
+ Language.Hakaru.Types.HClasses: [HDiscrete_Int] :: HDiscrete 'HInt
- Language.Hakaru.Types.HClasses: [HDiscrete_Nat] :: HDiscrete HNat
+ Language.Hakaru.Types.HClasses: [HDiscrete_Nat] :: HDiscrete 'HNat
- Language.Hakaru.Types.HClasses: [HEq_Array] :: !(HEq a) -> HEq (HArray a)
+ Language.Hakaru.Types.HClasses: [HEq_Array] :: !(HEq a) -> HEq ( 'HArray a)
- Language.Hakaru.Types.HClasses: [HEq_Int] :: HEq HInt
+ Language.Hakaru.Types.HClasses: [HEq_Int] :: HEq 'HInt
- Language.Hakaru.Types.HClasses: [HEq_Nat] :: HEq HNat
+ Language.Hakaru.Types.HClasses: [HEq_Nat] :: HEq 'HNat
- Language.Hakaru.Types.HClasses: [HEq_Prob] :: HEq HProb
+ Language.Hakaru.Types.HClasses: [HEq_Prob] :: HEq 'HProb
- Language.Hakaru.Types.HClasses: [HEq_Real] :: HEq HReal
+ Language.Hakaru.Types.HClasses: [HEq_Real] :: HEq 'HReal
- Language.Hakaru.Types.HClasses: [HFractional_Prob] :: HFractional HProb
+ Language.Hakaru.Types.HClasses: [HFractional_Prob] :: HFractional 'HProb
- Language.Hakaru.Types.HClasses: [HFractional_Real] :: HFractional HReal
+ Language.Hakaru.Types.HClasses: [HFractional_Real] :: HFractional 'HReal
- Language.Hakaru.Types.HClasses: [HIntegrable_Nat] :: HIntegrable HNat
+ Language.Hakaru.Types.HClasses: [HIntegrable_Nat] :: HIntegrable 'HNat
- Language.Hakaru.Types.HClasses: [HIntegrable_Prob] :: HIntegrable HProb
+ Language.Hakaru.Types.HClasses: [HIntegrable_Prob] :: HIntegrable 'HProb
- Language.Hakaru.Types.HClasses: [HOrd_Array] :: !(HOrd a) -> HOrd (HArray a)
+ Language.Hakaru.Types.HClasses: [HOrd_Array] :: !(HOrd a) -> HOrd ( 'HArray a)
- Language.Hakaru.Types.HClasses: [HOrd_Int] :: HOrd HInt
+ Language.Hakaru.Types.HClasses: [HOrd_Int] :: HOrd 'HInt
- Language.Hakaru.Types.HClasses: [HOrd_Nat] :: HOrd HNat
+ Language.Hakaru.Types.HClasses: [HOrd_Nat] :: HOrd 'HNat
- Language.Hakaru.Types.HClasses: [HOrd_Prob] :: HOrd HProb
+ Language.Hakaru.Types.HClasses: [HOrd_Prob] :: HOrd 'HProb
- Language.Hakaru.Types.HClasses: [HOrd_Real] :: HOrd HReal
+ Language.Hakaru.Types.HClasses: [HOrd_Real] :: HOrd 'HReal
- Language.Hakaru.Types.HClasses: [HRadical_Prob] :: HRadical HProb
+ Language.Hakaru.Types.HClasses: [HRadical_Prob] :: HRadical 'HProb
- Language.Hakaru.Types.HClasses: [HRing_Int] :: HRing HInt
+ Language.Hakaru.Types.HClasses: [HRing_Int] :: HRing 'HInt
- Language.Hakaru.Types.HClasses: [HRing_Real] :: HRing HReal
+ Language.Hakaru.Types.HClasses: [HRing_Real] :: HRing 'HReal
- Language.Hakaru.Types.HClasses: [HSemiring_Int] :: HSemiring HInt
+ Language.Hakaru.Types.HClasses: [HSemiring_Int] :: HSemiring 'HInt
- Language.Hakaru.Types.HClasses: [HSemiring_Nat] :: HSemiring HNat
+ Language.Hakaru.Types.HClasses: [HSemiring_Nat] :: HSemiring 'HNat
- Language.Hakaru.Types.HClasses: [HSemiring_Prob] :: HSemiring HProb
+ Language.Hakaru.Types.HClasses: [HSemiring_Prob] :: HSemiring 'HProb
- Language.Hakaru.Types.HClasses: [HSemiring_Real] :: HSemiring HReal
+ Language.Hakaru.Types.HClasses: [HSemiring_Real] :: HSemiring 'HReal
- Language.Hakaru.Types.HClasses: class (HSemiring_ (HIntegral a), HFractional_ a) => HContinuous_ (a :: Hakaru) where type HIntegral (a :: Hakaru) :: Hakaru where {
+ Language.Hakaru.Types.HClasses: class (HSemiring_ (HIntegral a), HFractional_ a) => HContinuous_ (a :: Hakaru) where {
- Language.Hakaru.Types.HClasses: class (HSemiring_ (NonNegative a), HSemiring_ a) => HRing_ (a :: Hakaru) where type NonNegative (a :: Hakaru) :: Hakaru where {
+ Language.Hakaru.Types.HClasses: class (HSemiring_ (NonNegative a), HSemiring_ a) => HRing_ (a :: Hakaru) where {
- Language.Hakaru.Types.Sing: sUnArray :: Sing (HArray a) -> Sing a
+ Language.Hakaru.Types.Sing: sUnArray :: Sing ( 'HArray a) -> Sing a
- Language.Hakaru.Types.Sing: sUnMeasure :: Sing (HMeasure a) -> Sing a
+ Language.Hakaru.Types.Sing: sUnMeasure :: Sing ( 'HMeasure a) -> Sing a
Files
- commands/Compile.hs +21/−37
- commands/Disintegrate.hs +4/−4
- commands/HKC.hs +5/−3
- commands/Hakaru.hs +25/−59
- commands/HkMaple.hs +86/−53
- commands/Mh.hs +28/−11
- commands/Pretty.hs +58/−8
- commands/PrettyInternal.hs +51/−0
- commands/Summary.hs +19/−34
- hakaru.cabal +101/−85
- haskell/Data/Number/Nat.hs +15/−5
- haskell/Data/Number/Natural.hs +12/−2
- haskell/Data/Text/Utf8.hs +0/−2
- haskell/Language/Hakaru/CodeGen/AST.hs +5/−4
- haskell/Language/Hakaru/CodeGen/CodeGenMonad.hs +122/−87
- haskell/Language/Hakaru/CodeGen/Flatten.hs +183/−156
- haskell/Language/Hakaru/CodeGen/Libs.hs +33/−1
- haskell/Language/Hakaru/CodeGen/Pretty.hs +20/−18
- haskell/Language/Hakaru/CodeGen/Types.hs +37/−9
- haskell/Language/Hakaru/CodeGen/Wrapper.hs +30/−20
- haskell/Language/Hakaru/Command.hs +43/−10
- haskell/Language/Hakaru/Disintegrate.hs +57/−22
- haskell/Language/Hakaru/Evaluation/DisintegrationMonad.hs +15/−5
- haskell/Language/Hakaru/Evaluation/ExpectMonad.hs +4/−2
- haskell/Language/Hakaru/Evaluation/Lazy.hs +19/−21
- haskell/Language/Hakaru/Evaluation/Types.hs +2/−4
- haskell/Language/Hakaru/Expect.hs +28/−6
- haskell/Language/Hakaru/Inference.hs +46/−20
- haskell/Language/Hakaru/Maple.hs +134/−29
- haskell/Language/Hakaru/Parser/AST.hs +132/−56
- haskell/Language/Hakaru/Parser/Import.hs +11/−9
- haskell/Language/Hakaru/Parser/Maple.hs +13/−4
- haskell/Language/Hakaru/Parser/Parser.hs +367/−276
- haskell/Language/Hakaru/Parser/SymbolResolve.hs +117/−30
- haskell/Language/Hakaru/Pretty/Concrete.hs +454/−459
- haskell/Language/Hakaru/Pretty/Haskell.hs +101/−21
- haskell/Language/Hakaru/Pretty/Maple.hs +17/−12
- haskell/Language/Hakaru/Pretty/SExpression.hs +316/−0
- haskell/Language/Hakaru/Runtime/CmdLine.hs +33/−15
- haskell/Language/Hakaru/Runtime/LogFloatCmdLine.hs +0/−74
- haskell/Language/Hakaru/Runtime/LogFloatPrelude.hs +62/−47
- haskell/Language/Hakaru/Runtime/Prelude.hs +21/−41
- haskell/Language/Hakaru/Sample.hs +116/−87
- haskell/Language/Hakaru/Simplify.hs +19/−4
- haskell/Language/Hakaru/Summary.hs +4/−3
- haskell/Language/Hakaru/Syntax/ABT.hs +17/−8
- haskell/Language/Hakaru/Syntax/AST.hs +23/−81
- haskell/Language/Hakaru/Syntax/AST/Eq.hs +67/−38
- haskell/Language/Hakaru/Syntax/AST/Sing.hs +3/−1
- haskell/Language/Hakaru/Syntax/AST/Transforms.hs +193/−15
- haskell/Language/Hakaru/Syntax/Command.hs +0/−80
- haskell/Language/Hakaru/Syntax/Datum.hs +4/−6
- haskell/Language/Hakaru/Syntax/DatumCase.hs +1/−3
- haskell/Language/Hakaru/Syntax/Hoist.hs +11/−2
- haskell/Language/Hakaru/Syntax/IClasses.hs +31/−4
- haskell/Language/Hakaru/Syntax/Prelude.hs +14/−7
- haskell/Language/Hakaru/Syntax/Reducer.hs +1/−1
- haskell/Language/Hakaru/Syntax/Rename.hs +0/−8
- haskell/Language/Hakaru/Syntax/SArgs.hs +91/−0
- haskell/Language/Hakaru/Syntax/Transform.hs +257/−0
- haskell/Language/Hakaru/Syntax/TypeCheck.hs +278/−549
- haskell/Language/Hakaru/Syntax/TypeCheck/TypeCheckMonad.hs +418/−0
- haskell/Language/Hakaru/Syntax/TypeCheck/Unification.hs +113/−0
- haskell/Language/Hakaru/Syntax/TypeOf.hs +8/−8
- haskell/Language/Hakaru/Syntax/Uniquify.hs +0/−1
- haskell/Language/Hakaru/Syntax/Value.hs +8/−10
- haskell/Language/Hakaru/Syntax/Variable.hs +17/−5
- haskell/Language/Hakaru/Types/Coercion.hs +2/−0
- haskell/Language/Hakaru/Types/HClasses.hs +9/−7
- haskell/Language/Hakaru/Types/Sing.hs +26/−3
- haskell/Tests/Parser.hs +18/−16
- haskell/Tests/Pretty.hs +98/−0
- haskell/Tests/Relationships.hs +369/−0
- haskell/Tests/RoundTrip.hs +242/−962
- haskell/Tests/TestSuite.hs +8/−8
- haskell/Tests/TestTools.hs +129/−32
commands/Compile.hs view
@@ -17,8 +17,7 @@ import Language.Hakaru.Syntax.TypeCheck import Language.Hakaru.Syntax.IClasses-import Language.Hakaru.Types.Sing-import Language.Hakaru.Types.DataKind+import Language.Hakaru.Types.Sing (Sing(SFun, SMeasure)) import Language.Hakaru.Pretty.Haskell import Language.Hakaru.Command@@ -86,29 +85,29 @@ prettyProg :: (ABT T.Term abt) => String+ -> Sing a -> abt '[] a -> String-prettyProg name ast =+prettyProg name typ ast = renderStyle style- (cat [ text (name ++ " = ")- , nest 2 (pretty ast)- ])+ ( sep [text (name ++ " ::"), nest 2 (prettyType typ)]+ $+$ sep [text (name ++ " =") , nest 2 (pretty ast)] ) compileHakaru :: Options -> IO () compileHakaru opts = do- let file = fileIn opts- prog <- readFromFile file+ let infile = fileIn opts+ prog <- readFromFile infile case parseAndInfer prog of Left err -> IO.hPutStrLn stderr err Right (TypedAST typ ast) -> do let ast' = (if optimize opts then optimizations else id) (et ast)- writeHkHsToFile file (fileOut opts) . TxT.unlines $+ writeHkHsToFile infile (fileOut opts) . TxT.unlines $ header (logFloatPrelude opts) (asModule opts) ++- [ pack $ prettyProg "prog" ast' ] +++ [ pack $ prettyProg "prog" typ ast' ] ++ (case asModule opts of- Nothing -> footer (logFloatPrelude opts) typ+ Nothing -> footer Just _ -> []) where et = expandTransformations @@ -128,8 +127,8 @@ | (Just Refl, Just Refl) <- (jmEq1 a b, jmEq1 b c) -> writeHkHsToFile f1 (fileOut opts) . TxT.unlines $ header (logFloatPrelude opts) (asModule opts) ++- [ pack $ prettyProg "prog1" (expandTransformations ast1) ] ++- [ pack $ prettyProg "prog2" (expandTransformations ast2) ] +++ [ pack $ prettyProg "prog1" typ1 (expandTransformations ast1) ] +++ [ pack $ prettyProg "prog2" typ2 (expandTransformations ast2) ] ++ (case asModule opts of Nothing -> footerWalk Just _ -> [])@@ -155,14 +154,13 @@ , "" , if logfloats then TxT.unlines [ "import Data.Number.LogFloat (LogFloat)"- , "import Prelude hiding (product, exp, log, (**))"+ , "import Prelude hiding (product, exp, log, (**), pi)"+ , "import Language.Hakaru.Runtime.LogFloatPrelude" ]- else "import Prelude hiding (product)"- , if logfloats- then TxT.unlines [ "import Language.Hakaru.Runtime.LogFloatPrelude"- , "import Language.Hakaru.Runtime.LogFloatCmdLine" ]- else TxT.unlines [ "import Language.Hakaru.Runtime.Prelude"- , "import Language.Hakaru.Runtime.CmdLine" ]+ else TxT.unlines [ "import Prelude hiding (product)"+ , "import Language.Hakaru.Runtime.Prelude"+ ]+ , "import Language.Hakaru.Runtime.CmdLine" , "import Language.Hakaru.Types.Sing" , "import qualified System.Random.MWC as MWC" , "import Control.Monad"@@ -170,24 +168,10 @@ , "" ] -footer :: forall (a :: Hakaru) . Bool -> Sing a -> [Text]-footer logfloats typ =+footer :: [Text]+footer = ["","main :: IO ()"- , TxT.concat ["main = makeMain (prog :: ",toHsType typ,") =<< getArgs"]]- where toHsType :: forall (a :: Hakaru) . Sing a -> Text- toHsType SInt = "Int"- toHsType SNat = "Int"- toHsType SReal = "Double"- toHsType SProb = if logfloats then "LogFloat" else "Double"- toHsType (SArray t) = let t' = toHsType t in- TxT.concat ["(",TxT.unwords ["MayBoxVec",t',t'],")"]- toHsType (SMeasure t) = TxT.concat ["(",TxT.unwords ["Measure",toHsType t],")"]- toHsType (SFun t1 t2) = TxT.unwords [toHsType t1,"->",toHsType t2]- toHsType (SData _- ((SKonst t1 `SEt` SKonst t2 `SEt` SDone) `SPlus` SVoid)) =- TxT.concat ["(",toHsType t1,",",toHsType t2,")"]- toHsType _ = "type"-+ , TxT.concat ["main = makeMain prog =<< getArgs"]] footerWalk :: [Text] footerWalk =
commands/Disintegrate.hs view
@@ -65,8 +65,8 @@ main = do args <- parseOpts case args of- Options t i file -> do- prog <- readFromFile file+ Options t i infile -> do+ prog <- readFromFile infile runDisintegrate prog t i runDisintegrate :: T.Text -> Bool -> Int -> IO ()@@ -99,13 +99,13 @@ _ -> putErrorMsg ast putErrorMsg :: (Show a) => a -> IO ()-putErrorMsg a = IO.hPutStrLn stderr . T.pack $+putErrorMsg _ = IO.hPutStrLn stderr . T.pack $ "Can only disintegrate (functions over) measures over pairs" -- ++ "\nGiven\n" ++ show a -- | Use a list of variables to wrap lambdas around a given term lams :: (ABT AST.Term abt) => List1 Variable (xs :: [Hakaru])- -> (forall a. abt '[] a -> IO ()) -> abt '[] a -> IO ()+ -> (forall b. abt '[] b -> IO ()) -> abt '[] a -> IO () lams Nil1 k = k lams (Cons1 x xs) k = lams xs (k . lam_ x)
commands/HKC.hs view
@@ -40,7 +40,7 @@ , asFunc :: Maybe String , fileIn :: String , fileOut :: Maybe String- , par :: Bool+ , par :: Bool -- turns on simd and sharedMem , noWeightsOpt :: Bool , showProbInLogOpt :: Bool , garbageCollector :: Bool@@ -77,7 +77,7 @@ <> metavar "OUTPUT" <> help "output FILE")) <*> switch ( short 'j'- <> help "Generates parallel programs using OpenMP directives")+ <> help "Generates multithreaded and simd parallel programs using OpenMP directives") <*> switch ( long "no-weights" <> short 'w' <> help "Don't print the weights")@@ -110,7 +110,9 @@ (asFunc config) (PrintConfig { noWeights = noWeightsOpt config , showProbInLog = showProbInLogOpt config })- codeGenConfig = emptyCG {sharedMem = par config, managedMem = garbageCollector config}+ codeGenConfig = emptyCG { sharedMem = par config+ , simd = par config+ , managedMem = garbageCollector config} cast = CAST $ runCodeGenWith codeGen codeGenConfig output = pack . render . pretty $ cast when (debug config) $ do
commands/Hakaru.hs view
@@ -1,5 +1,4 @@-{-# LANGUAGE CPP- , OverloadedStrings+{-# LANGUAGE OverloadedStrings , PatternGuards , DataKinds , GADTs@@ -10,25 +9,23 @@ import Language.Hakaru.Syntax.AST.Transforms import Language.Hakaru.Syntax.TypeCheck+import Language.Hakaru.Syntax.TypeCheck.Unification import Language.Hakaru.Syntax.Value -import Language.Hakaru.Syntax.IClasses import Language.Hakaru.Types.Sing import Language.Hakaru.Types.DataKind import Language.Hakaru.Sample import Language.Hakaru.Pretty.Concrete-import Language.Hakaru.Command ( parseAndInfer, parseAndInfer'- , readFromFile, Term+import Language.Hakaru.Command ( parseAndInfer'+ , readFromFile', Term, Source+ , sourceInput ) -#if __GLASGOW_HASKELL__ < 710-import Control.Applicative (Applicative(..), (<$>))-#endif+import Control.Applicative (Applicative(..), (<$>), liftA2) import Control.Monad import Data.Monoid-import Data.Text import qualified Data.Text.IO as IO import qualified Data.Vector as V import Data.Word@@ -73,10 +70,10 @@ Nothing -> MWC.createSystemRandom Just s -> MWC.initialize (V.singleton s) case transition args of- Nothing -> runHakaru' g (noWeights args) =<< readFromFile (prog args)- Just prog2 -> do prog' <- readFromFile (prog args)- trans <- readFromFile prog2- randomWalk' g trans prog'+ Nothing -> runHakaru g (noWeights args) =<< readFromFile' (prog args)+ Just prog2 -> do prog' <- readFromFile' (prog args)+ trans <- readFromFile' prog2+ randomWalk g trans prog' -- TODO: A better needs to be found for passing weights around illustrate :: Sing a -> Bool -> MWC.GenIO -> Value a -> IO ()@@ -98,22 +95,9 @@ renderLn = putStrLn . renderStyle style {mode = LeftMode} . prettyValue -- TODO: A better needs to be found for passing weights around-runHakaru :: MWC.GenIO -> Bool -> Text -> IO ()-runHakaru g weights prog' =- case parseAndInfer prog' of- Left err -> IO.hPutStrLn stderr err- Right (TypedAST typ ast) -> do- case typ of- SMeasure _ -> forever (illustrate typ weights g $ run ast)- _ -> illustrate typ weights g $ run ast- where- run :: Term a -> Value a- run = runEvaluate . expandTransformations---- TODO: A better needs to be found for passing weights around-runHakaru' :: MWC.GenIO -> Bool -> Text -> IO ()-runHakaru' g weights prog = do- prog' <- parseAndInfer' prog+runHakaru :: MWC.GenIO -> Bool -> Source -> IO ()+runHakaru g weights progname = do+ prog' <- parseAndInfer' progname case prog' of Left err -> IO.hPutStrLn stderr err Right (TypedAST typ ast) -> do@@ -124,40 +108,22 @@ run :: Term a -> Value a run = runEvaluate . expandTransformations -randomWalk :: MWC.GenIO -> Text -> Text -> IO ()-randomWalk g p1 p2 =- case (parseAndInfer p1, parseAndInfer p2) of- (Right (TypedAST typ1 ast1), Right (TypedAST typ2 ast2)) ->- -- TODO: Use better error messages for type mismatch- case (typ1, typ2) of- (SFun a (SMeasure b), SMeasure c)- | (Just Refl, Just Refl) <- (jmEq1 a b, jmEq1 b c)- -> iterateM_ (chain $ run ast1) (run ast2)- _ -> IO.hPutStrLn stderr "hakaru: programs have wrong type"- (Left err, _) -> IO.hPutStrLn stderr err- (_, Left err) -> IO.hPutStrLn stderr err- where- run :: Term a -> Value a- run = runEvaluate . expandTransformations-- chain :: Value (a ':-> b) -> Value ('HMeasure a) -> IO (Value b)- chain (VLam f) (VMeasure m) = do- Just (samp,_) <- m (VProb 1) g- renderLn samp- return (f samp)--randomWalk' :: MWC.GenIO -> Text -> Text -> IO ()-randomWalk' g p1 p2 = do+randomWalk :: MWC.GenIO -> Source -> Source -> IO ()+randomWalk g p1 p2 = do+ let inp = foldl1 (liftA2 (V.++)) $ map sourceInput [p1,p2] p1' <- parseAndInfer' p1 p2' <- parseAndInfer' p2 case (p1', p2') of (Right (TypedAST typ1 ast1), Right (TypedAST typ2 ast2)) ->- -- TODO: Use better error messages for type mismatch- case (typ1, typ2) of- (SFun a (SMeasure b), SMeasure c)- | (Just Refl, Just Refl) <- (jmEq1 a b, jmEq1 b c)- -> iterateM_ (chain $ run ast1) (run ast2)- _ -> IO.hPutStrLn stderr "hakaru: programs have wrong type"+ let check =+ unifyFun typ1 Nothing $ \a mb ->+ unifyMeasure mb Nothing $ \b ->+ unifyMeasure typ2 Nothing $ \c ->+ matchTypes a b Nothing (SFun a (SMeasure a)) typ1 $+ matchTypes b c Nothing mb typ2 $+ return $ iterateM_ (chain $ run ast1) (run ast2)+ in either (IO.hPutStrLn stderr) id $+ runTCM check inp LaxMode (Left err, _) -> IO.hPutStrLn stderr err (_, Left err) -> IO.hPutStrLn stderr err where
commands/HkMaple.hs view
@@ -8,58 +8,62 @@ module Main where -import Language.Hakaru.Pretty.Concrete +import Language.Hakaru.Pretty.Concrete as C+import Language.Hakaru.Pretty.SExpression as S+import Language.Hakaru.Pretty.Haskell as H import Language.Hakaru.Syntax.AST.Transforms import Language.Hakaru.Syntax.TypeCheck-import Language.Hakaru.Command (parseAndInfer, readFromFile, Term)+import Language.Hakaru.Command (parseAndInfer', readFromFile') import Language.Hakaru.Syntax.Rename-import Language.Hakaru.Simplify-import Language.Hakaru.Maple -import Language.Hakaru.Parser.Maple +import Language.Hakaru.Maple +import Language.Hakaru.Syntax.Transform (Transform(..)+ ,someTransformations)+import Language.Hakaru.Syntax.IClasses (Some2(..)) #if __GLASGOW_HASKELL__ < 710 import Control.Applicative (Applicative(..), (<$>)) #endif -import Data.Monoid ((<>), mconcat)-import Data.Text (Text, unpack, pack)-import qualified Data.Text as Text -import qualified Data.Text.IO as IO+import Data.Monoid ((<>), Monoid(..))+import qualified Data.Text as Text+import qualified Data.Text.Utf8 as IO import System.IO (stderr)-import Data.List (intercalate) +import Data.List (intercalate) import Text.Read (readMaybe) import Control.Exception(throw) import qualified Options.Applicative as O-import qualified Data.Map as M +import qualified Data.Map as M -data Options a +data Options a = Options- { moptions :: MapleOptions String+ { moptions :: MapleOptions (Maybe String) , no_unicode :: Bool- , program :: a } - | ListCommands + , toExpand :: Maybe [Some2 Transform]+ , printer :: String+ , program :: a }+ | ListCommands+ | PrintVersion -parseKeyVal :: O.ReadM (String, String) -parseKeyVal = - O.maybeReader $ (\str -> - case map Text.strip $ Text.splitOn "," str of - [k,v] -> return (unpack k, unpack v)- _ -> Nothing) . pack +parseKeyVal :: O.ReadM (String, String)+parseKeyVal =+ O.maybeReader $ (\str ->+ case map Text.strip $ Text.splitOn "," str of+ [k,v] -> return (Text.unpack k, Text.unpack v)+ _ -> Nothing) . Text.pack options :: O.Parser (Options FilePath) options = (Options- <$> (MapleOptions <$> - O.option O.str+ <$> (MapleOptions <$>+ O.option (O.maybeReader (Just . Just)) ( O.long "command" <> O.help ("Command to send to Maple. You may enter a prefix of the command string if "- ++"it uniquely identifies a command. "- ++"Default: Simplify") <>- O.short 'c' <> - O.value "Simplify" ) + ++"it uniquely identifies a command. ") <>+ O.short 'c' <>+ O.value Nothing ) <*> O.switch ( O.long "debug" <> O.help "Prints output that is sent to Maple." )@@ -69,31 +73,45 @@ O.showDefault <> O.value 90 <> O.metavar "N")- <*> (M.fromList <$> + <*> (M.fromList <$> O.many (O.option parseKeyVal- ( O.long "maple-opt" <> - O.short 'm' <> + ( O.long "maple-opt" <>+ O.short 'm' <> O.help ( "Extra options to send to Maple\neach options is of the form KEY=VAL\n" ++"where KEY is a Maple name, and VAL is a Maple expression.")- ))))- <*> O.switch - ( O.long "no-unicode" <> - O.short 'u' <> + )))+ <*> pure mempty)+ <*> O.switch+ ( O.long "no-unicode" <>+ O.short 'u' <> O.help "Removes unicode characters from names in the Maple output.")+ <*> O.option (O.maybeReader $ fmap (fmap Just) readMaybe)+ ( O.short 'e' <>+ O.long "to-expand" <>+ O.value Nothing <>+ O.help "Transformations to be expanded; default is all transformations" )+ <*> O.strOption+ ( O.short 'p' <>+ O.long "printer" <>+ O.value "concrete" ) <*> O.strArgument- ( O.metavar "PROGRAM" <> - O.help "Filename containing program to be simplified, or \"-\" to read from input." )) O.<|> - ( O.flag' ListCommands + ( O.metavar "PROGRAM" <>+ O.help "Filename containing program to be simplified, or \"-\" to read from input." )) O.<|>+ ( O.flag' ListCommands ( O.long "list-commands" <> O.help "Get list of available commands from Maple." <>- O.short 'l') )+ O.short 'l') ) O.<|>+ ( O.flag' PrintVersion+ ( O.long "version" <>+ O.help "Prints the version of the Hakaru Maple library." <>+ O.short 'v') ) parseOpts :: IO (Options FilePath) parseOpts = O.execParser $ O.info (O.helper <*> options) (O.fullDesc <> O.progDesc progDesc) -progDesc :: String -progDesc = unwords +progDesc :: String+progDesc = unwords ["hk-maple: invokes a Maple command on a Hakaru program. " ,"Given a Hakaru program in concrete syntax and a Maple-Hakaru command," ,"typecheck the program"@@ -101,28 +119,43 @@ ,"pretty print, parse and typecheck the program resulting from Maple" ] -et (TypedAST t (x :: Term a)) = TypedAST t (expandTransformations x)- main :: IO () main = parseOpts >>= runMaple runMaple :: Options FilePath -> IO ()-runMaple ListCommands = +runMaple ListCommands = listCommands >>= \cs -> putStrLn $ "Available Hakaru Maple commands:\n\t"++ intercalate ", " cs -runMaple Options{..} = readFromFile program >>= \prog -> - case parseAndInfer prog of+runMaple PrintVersion = printVersion++runMaple Options{..} = readFromFile' program >>= parseAndInfer' >>= \prog ->+ case prog of Left err -> IO.hPutStrLn stderr err- Right ast -> do - TypedAST _ ast' <- sendToMaple' moptions (et ast)- print $ pretty - $ (if no_unicode then renameAST removeUnicodeChars else id) + Right ast -> do+ let et = onTypedASTM $ expandTransformationsWith $+ (maybe id someTransformations toExpand)+ (allTransformationsWithMOpts moptions{command=()})+ TypedAST typ ast' <-+ (case command moptions of+ Just c -> sendToMaple' moptions{command=c}+ Nothing -> return) =<< et ast+ IO.print+ $ (case printer of+ "concrete" -> C.pretty+ "sexpression" -> S.pretty+ "haskell" -> H.prettyString typ+ _ -> error "Invalid printer requested")+ $ (if no_unicode then renameAST removeUnicodeChars else id) $ ast' -listCommands :: IO [String] -listCommands = do +listCommands :: IO [String]+listCommands = do let toMaple_ = "use Hakaru, NewSLO in lprint(map(curry(sprintf,`%s`),NewSLO:-Commands)) end use;" fromMaple <- maple toMaple_ maybe (throw $ MapleInterpreterException fromMaple toMaple_)- return - (readMaybe fromMaple) + return+ (readMaybe fromMaple)++printVersion :: IO ()+printVersion =+ maple "use Hakaru, NewSLO in NewSLO:-PrintVersion() end use;" >>= putStr
commands/Mh.hs view
@@ -1,4 +1,11 @@-{-# LANGUAGE OverloadedStrings, PatternGuards, DataKinds, GADTs #-}+{-# LANGUAGE OverloadedStrings+ , PatternGuards+ , DataKinds+ , GADTs+ , KindSignatures+ , RankNTypes+ , TypeOperators+ , FlexibleContexts #-} module Main where @@ -6,9 +13,11 @@ import Language.Hakaru.Syntax.TypeCheck import Language.Hakaru.Syntax.IClasses-import Language.Hakaru.Types.Sing-import Language.Hakaru.Inference-import Language.Hakaru.Command+import Language.Hakaru.Syntax.ABT (ABT(..), dupABT)+import Language.Hakaru.Syntax.AST (Term(..), Transform(..))+import Language.Hakaru.Syntax.AST.Transforms (expandTransformations)+import qualified Language.Hakaru.Parser.AST as U+import Language.Hakaru.Command hiding (Term) import Data.Text import qualified Data.Text.IO as IO@@ -27,12 +36,20 @@ runMH :: Text -> Text -> IO () runMH prog1 prog2 = case (parseAndInfer prog1, parseAndInfer prog2) of- (Right (TypedAST typ1 ast1), Right (TypedAST typ2 ast2)) ->- -- TODO: Use better error messages for type mismatch- case (typ1, typ2) of- (SFun a (SMeasure b), SMeasure c)- | (Just Refl, Just Refl) <- (jmEq1 a b, jmEq1 b c)- -> print . pretty $ mcmc ast1 ast2- _ -> IO.hPutStrLn stderr "mh: programs have wrong type"+ (Right (TypedAST _ ast1), Right (TypedAST _ ast2)) ->+ either (IO.hPutStrLn stderr)+ (elimTypedAST $ \_ -> print . pretty) $+ runMH' ast1 ast2 (Left err, _) -> IO.hPutStrLn stderr err (_, Left err) -> IO.hPutStrLn stderr err++runMH' :: (ABT Term abt)+ => abt '[] a+ -> abt '[] b+ -> Either Text (TypedAST abt)+runMH' prop tgt =+ let uast = syn $ U.Transform_ MCMC $+ (Nil2, syn $ U.InjTyped $ dupABT prop) U.:*+ (Nil2, syn $ U.InjTyped $ dupABT tgt ) U.:* U.End+ in do TypedAST rty res <- runTCM (inferType uast) Nothing LaxMode+ return $ TypedAST rty $ expandTransformations res
commands/Pretty.hs view
@@ -1,22 +1,72 @@-{-# LANGUAGE OverloadedStrings, DataKinds, GADTs #-}+{-# LANGUAGE OverloadedStrings+ , DataKinds+ , GADTs+ , CPP+ , RecordWildCards+ #-} module Main where import Language.Hakaru.Pretty.Concrete import Language.Hakaru.Syntax.AST.Transforms+import Language.Hakaru.Syntax.Transform (Transform(..)+ ,someTransformations)+import Language.Hakaru.Syntax.IClasses (Some2(..)) import Language.Hakaru.Syntax.TypeCheck import Language.Hakaru.Command -import Data.Text+import qualified Data.Text as T import qualified Data.Text.Utf8 as IO import System.IO (stderr)+import Data.Monoid +#if __GLASGOW_HASKELL__ < 710+import Control.Applicative (Applicative(..), (<$>), (<*>))+#endif+import qualified Options.Applicative as O++data Options = Options+ { printType :: Bool + , program :: FilePath + , toExpand :: [Some2 Transform]+ }++options :: O.Parser Options+options = Options+ <$> O.switch+ ( O.short 't' <>+ O.long "print-type" <>+ O.help "Annotate the program with its type." )+ <*> O.strArgument+ ( O.metavar "PROGRAM" <> + O.help "Filename containing program to be pretty printed, or \"-\" to read from input." ) + <*> O.option O.auto+ ( O.short 'e' <>+ O.long "to-expand" <>+ O.value [Some2 Expect, Some2 Observe] <>+ O.help "Transformations to be expanded; default [Expect, Observe]" )++parseOpts :: IO Options+parseOpts = O.execParser $ O.info (O.helper <*> options)+ (O.fullDesc <> O.progDesc "Parse, typecheck, and pretty print a Hakaru program")+ main :: IO ()-main = simpleCommand runPretty "pretty"+main = parseOpts >>= runPretty -runPretty :: Text -> IO ()-runPretty prog =- case parseAndInfer prog of- Left err -> IO.hPutStrLn stderr err- Right (TypedAST _ ast) -> IO.print . pretty . expandTransformations $ ast+runPretty :: Options -> IO ()+runPretty Options{..} = readFromFile' program >>= parseAndInfer' >>= \prog ->+ case prog of+ Left err -> IO.hPutStrLn stderr err+ Right (TypedAST typ ast) -> IO.putStrLn . T.pack $+ let et = expandTransformationsWith'+ (someTransformations toExpand haskellTransformations)+ concreteProgram = show . pretty . et $ ast+ withType t x = concat [ "(", x, ")"+ , "\n.\n"+ , show (prettyType 12 t)+ ] in++ if printType then+ withType typ concreteProgram+ else concreteProgram
+ commands/PrettyInternal.hs view
@@ -0,0 +1,51 @@+{-# LANGUAGE OverloadedStrings, DataKinds, GADTs, CPP, RecordWildCards #-}++module Main where++import Language.Hakaru.Syntax.AST.Transforms+import Language.Hakaru.Syntax.TypeCheck+import Language.Hakaru.Command++import qualified Data.Text as T+import qualified Data.Text.Utf8 as IO+import System.IO (stderr)+import Data.Monoid++#if __GLASGOW_HASKELL__ < 710+import Control.Applicative (Applicative(..), (<$>), (<*>))+#endif+import qualified Options.Applicative as O++data Options = Options+ { printType :: Bool + , program :: FilePath + }++options :: O.Parser Options+options = Options+ <$> O.switch+ ( O.short 't' <>+ O.long "print-type" <>+ O.help "Print the type of the program as well." )+ <*> O.strArgument+ ( O.metavar "PROGRAM" <> + O.help "Filename containing program to be printed, or \"-\" to read from input." ) ++parseOpts :: IO Options+parseOpts = O.execParser $ O.info (O.helper <*> options)+ (O.fullDesc <> O.progDesc "Parse, typecheck, and print (in internal syntax) a Hakaru program")++main :: IO ()+main = parseOpts >>= runPretty ++runPretty :: Options -> IO ()+runPretty Options{..} = readFromFile' program >>= parseAndInfer' >>= \prog ->+ case prog of+ Left err -> IO.hPutStrLn stderr err+ Right (TypedAST ty ast) -> IO.putStrLn $+ -- TODO: prettier (than `show') printing of internal syntax+ (if printType then \x ->+ T.concat [ "(", x, ")"+ , "\n.\n" <> T.pack (show ty) ]+ else id)+ (T.pack $ show $ expandTransformations ast)
commands/Summary.hs view
@@ -15,8 +15,7 @@ import Language.Hakaru.Syntax.ABT import Language.Hakaru.Syntax.TypeCheck -import Language.Hakaru.Types.Sing-import Language.Hakaru.Types.DataKind+import Language.Hakaru.Types.Sing (Sing) import Language.Hakaru.Pretty.Haskell import Language.Hakaru.Command@@ -79,29 +78,29 @@ prettyProg :: (ABT T.Term abt) => String+ -> Sing a -> abt '[] a -> String-prettyProg name ast =+prettyProg name typ ast = renderStyle style- (cat [ text (name ++ " = ")- , nest 2 (pretty ast)- ])+ ( sep [text (name ++ " ::"), nest 2 (prettyType typ)]+ $+$ sep [text (name ++ " =") , nest 2 (pretty ast)] ) compileHakaru :: Options -> IO () compileHakaru opts = do- let file = fileIn opts- prog <- readFromFile file+ let infile = fileIn opts+ prog <- readFromFile infile case parseAndInfer prog of Left err -> IO.hPutStrLn stderr err Right (TypedAST typ ast) -> do ast' <- (if optimize opts then optimizations else id) <$> summary (et ast)- writeHkHsToFile file (fileOut opts) . TxT.unlines $+ writeHkHsToFile infile (fileOut opts) . TxT.unlines $ header (logFloatPrelude opts) (asModule opts) ++- [ pack $ prettyProg "prog" ast' ] +++ [ pack $ prettyProg "prog" typ ast' ] ++ (case asModule opts of- Nothing -> footer typ+ Nothing -> footer Just _ -> []) where et = expandTransformations @@ -123,14 +122,13 @@ , "" , if logfloats then TxT.unlines [ "import Data.Number.LogFloat (LogFloat)"- , "import Prelude hiding (product, exp, log, (**))"+ , "import Prelude hiding (product, exp, log, (**), pi)"+ , "import Language.Hakaru.Runtime.LogFloatPrelude" ]- else "import Prelude hiding (product)"- , if logfloats- then TxT.unlines [ "import Language.Hakaru.Runtime.LogFloatPrelude"- , "import Language.Hakaru.Runtime.LogFloatCmdLine" ]- else TxT.unlines [ "import Language.Hakaru.Runtime.Prelude"- , "import Language.Hakaru.Runtime.CmdLine" ]+ else TxT.unlines [ "import Prelude hiding (product)"+ , "import Language.Hakaru.Runtime.Prelude"+ ]+ , "import Language.Hakaru.Runtime.CmdLine" , "import Language.Hakaru.Types.Sing" , "import qualified System.Random.MWC as MWC" , "import Control.Monad"@@ -138,23 +136,10 @@ , "" ] -footer :: Sing (a :: Hakaru) -> [Text]-footer typ =+footer :: [Text]+footer = ["","main :: IO ()"- , TxT.concat ["main = makeMain (prog :: ",toHsType typ,") =<< getArgs"]]- where toHsType :: Sing (a :: Hakaru) -> Text- toHsType SInt = "Int"- toHsType SNat = "Int"- toHsType SReal = "Double"- toHsType SProb = "LogFloat"- toHsType (SArray t) = let t' = toHsType t in- TxT.concat ["(",TxT.unwords ["MayBoxVec",t',t'],")"]- toHsType (SMeasure t) = TxT.concat ["(",TxT.unwords ["Measure",toHsType t],")"]- toHsType (SFun t1 t2) = TxT.unwords [toHsType t1,"->",toHsType t2]- toHsType (SData _- ((SKonst t1 `SEt` SKonst t2 `SEt` SDone) `SPlus` SVoid)) =- TxT.concat ["(",toHsType t1,",",toHsType t2,")"]- toHsType _ = "type"+ , TxT.concat ["main = makeMain prog =<< getArgs"]] footerWalk :: [Text] footerWalk =
hakaru.cabal view
@@ -3,11 +3,11 @@ cabal-version: >=1.16 build-type: Simple name: hakaru-version: 0.4.0+version: 0.6.0 synopsis: A probabilistic programming language description: Hakaru is a simply-typed probabilistic programming language, designed for easy specification of probabilistic models, and inference algorithms.-homepage: http://indiana.edu/~ppaml/+homepage: http://hakaru-dev.github.io/ license: BSD3 license-file: LICENSE author: The Hakaru Team@@ -30,7 +30,7 @@ Library Hs-Source-Dirs: haskell Default-Language: Haskell2010- GHC-Options: -Wall -fwarn-tabs -j6+ GHC-Options: -Wall -fwarn-tabs -j6 if flag(traceDisintegrate) Cpp-Options: -D__TRACE_DISINTEGRATE__@@ -48,33 +48,36 @@ Language.Hakaru.Types.HClasses, Language.Hakaru.Types.Coercion, Language.Hakaru.Syntax.ANF,- Language.Hakaru.Syntax.Uniquify,- Language.Hakaru.Syntax.Unroll, Language.Hakaru.Syntax.AST,- Language.Hakaru.Syntax.AST.Transforms,- Language.Hakaru.Syntax.AST.Sing, Language.Hakaru.Syntax.AST.Eq,- Language.Hakaru.Syntax.Command,+ Language.Hakaru.Syntax.AST.Sing,+ Language.Hakaru.Syntax.AST.Transforms, Language.Hakaru.Syntax.CSE, Language.Hakaru.Syntax.Gensym,- Language.Hakaru.Syntax.Rename, Language.Hakaru.Syntax.Hoist,+ Language.Hakaru.Syntax.Prelude, Language.Hakaru.Syntax.Prune,+ Language.Hakaru.Syntax.Rename,+ Language.Hakaru.Syntax.SArgs,+ Language.Hakaru.Syntax.Transform, Language.Hakaru.Syntax.TypeCheck,+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad,+ Language.Hakaru.Syntax.TypeCheck.Unification, Language.Hakaru.Syntax.TypeOf,- Language.Hakaru.Syntax.Prelude,+ Language.Hakaru.Syntax.Uniquify,+ Language.Hakaru.Syntax.Unroll, Language.Hakaru.Parser.AST, Language.Hakaru.Parser.Maple, Language.Hakaru.Parser.Import, Language.Hakaru.Parser.Parser, Language.Hakaru.Parser.SymbolResolve, Language.Hakaru.Pretty.Haskell,+ Language.Hakaru.Pretty.SExpression, Language.Hakaru.Pretty.Concrete, Language.Hakaru.Pretty.Maple, Language.Hakaru.Runtime.Prelude, Language.Hakaru.Runtime.LogFloatPrelude, Language.Hakaru.Runtime.CmdLine,- Language.Hakaru.Runtime.LogFloatCmdLine, Language.Hakaru.Observe, Language.Hakaru.Maple, Language.Hakaru.Simplify,@@ -105,31 +108,32 @@ other-modules: System.MapleSSH - build-depends: base >= 4.7 && < 5.0,- Cabal >= 1.16,- ghc-prim >= 0.3 && < 0.6,- transformers >= 0.3 && < 0.6,- transformers-compat >= 0.3 && < 0.6,- containers >= 0.5 && < 0.6,- semigroups >= 0.16,- pretty >= 1.1 && < 1.2,- logfloat >= 0.13 && < 0.14,- math-functions >= 0.1 && < 0.3,- vector >= 0.10,- indentation-parsec >= 0.0,- ansi-terminal >= 0.6,- text >= 0.11 && < 1.3,- parsec >= 3.1 && < 3.2,- mwc-random >= 0.13 && < 0.14,- directory >= 1.2 && < 1.4,- integration >= 0.2.0 && < 0.3.0,- primitive >= 0.5 && < 0.7,- process >= 1.1 && < 2.0,- HUnit >= 1.2 && < 2.0,- mtl >= 2.1,- filepath >= 1.1.0.2, - bytestring >= 0.9, - optparse-applicative >= 0.11 && < 0.15+ build-depends: base >= 4.7 && < 5.0,+ Cabal >= 1.16,+ ghc-prim >= 0.3 && < 0.6,+ transformers >= 0.3 && < 0.6,+ transformers-compat >= 0.3 && < 0.7,+ containers >= 0.5 && < 0.6,+ semigroups >= 0.16,+ pretty >= 1.1 && < 1.2,+ logfloat >= 0.13 && < 0.14,+ math-functions >= 0.1 && < 0.3,+ vector >= 0.10,+ indentation-parsec >= 0.0,+ text >= 0.11 && < 1.3,+ parsec >= 3.1 && < 3.2,+ mwc-random >= 0.13 && < 0.14,+ directory >= 1.2 && < 1.4,+ integration >= 0.2.0 && < 0.3.0,+ primitive >= 0.5 && < 0.7,+ process >= 1.1 && < 2.0,+ HUnit >= 1.2 && < 2.0,+ mtl >= 2.1,+ filepath >= 1.1.0.2,+ bytestring >= 0.9,+ optparse-applicative >= 0.11 && < 0.15,+ syb >= 0.6,+ exact-combinatorics >= 0.2.0 ---------------------------------------------------------------- Test-Suite system-testsuite@@ -138,7 +142,7 @@ Hs-Source-Dirs: haskell Default-Language: Haskell2010 GHC-Options: -Wall -fwarn-tabs- + other-modules: Data.Number.Nat Data.Number.Natural Data.Text.Utf8@@ -154,6 +158,7 @@ Language.Hakaru.Evaluation.Types Language.Hakaru.Expect Language.Hakaru.Inference+ Language.Hakaru.Maple Language.Hakaru.Parser.AST Language.Hakaru.Parser.Import Language.Hakaru.Parser.Maple@@ -168,6 +173,7 @@ Language.Hakaru.Syntax.ANF Language.Hakaru.Syntax.AST Language.Hakaru.Syntax.AST.Eq+ Language.Hakaru.Syntax.AST.Transforms Language.Hakaru.Syntax.AST.Sing Language.Hakaru.Syntax.CSE Language.Hakaru.Syntax.Datum@@ -179,7 +185,11 @@ Language.Hakaru.Syntax.Prelude Language.Hakaru.Syntax.Prune Language.Hakaru.Syntax.Reducer+ Language.Hakaru.Syntax.SArgs+ Language.Hakaru.Syntax.Transform Language.Hakaru.Syntax.TypeCheck+ Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad+ Language.Hakaru.Syntax.TypeCheck.Unification Language.Hakaru.Syntax.TypeOf Language.Hakaru.Syntax.Uniquify Language.Hakaru.Syntax.Unroll@@ -194,36 +204,40 @@ Tests.Disintegrate Tests.Models Tests.Parser+ Tests.Pretty+ Tests.Relationships Tests.RoundTrip Tests.Sample Tests.Simplify Tests.TestTools Tests.TypeCheck - Build-Depends: base >= 4.6 && < 5.0,- Cabal >= 1.16,- ghc-prim >= 0.3 && < 0.6,- indentation-parsec >= 0.0,- transformers >= 0.3 && < 0.6,- containers >= 0.5 && < 0.6,- semigroups >= 0.16,- logfloat >= 0.13 && < 0.14,- parsec >= 3.1 && < 3.2,- primitive >= 0.5 && < 0.7,- pretty >= 1.1 && < 1.2,- mwc-random >= 0.13 && < 0.14,- math-functions >= 0.1 && < 0.3,- integration >= 0.2 && < 0.3,- ansi-terminal >= 0.6,- HUnit >= 1.2 && < 2.0,- QuickCheck >= 2.6,- process >= 1.1 && < 2.0,- mtl >= 2.1,- vector >= 0.10,- text >= 0.11 && < 1.3, - bytestring >= 0.9, - directory >= 1.2 && < 1.4,- optparse-applicative >= 0.11 && < 0.15+ build-depends: base >= 4.6 && < 5.0,+ Cabal >= 1.16,+ ghc-prim >= 0.3 && < 0.6,+ indentation-parsec >= 0.0,+ transformers >= 0.3 && < 0.6,+ containers >= 0.5 && < 0.6,+ semigroups >= 0.16,+ logfloat >= 0.13 && < 0.14,+ parsec >= 3.1 && < 3.2,+ primitive >= 0.5 && < 0.7,+ pretty >= 1.1 && < 1.2,+ mwc-random >= 0.13 && < 0.14,+ math-functions >= 0.1 && < 0.3,+ integration >= 0.2 && < 0.3,+ HUnit >= 1.2 && < 2.0,+ QuickCheck >= 2.6,+ process >= 1.1 && < 2.0,+ mtl >= 2.1,+ vector >= 0.10,+ text >= 0.11 && < 1.3,+ bytestring >= 0.9,+ directory >= 1.2 && < 1.4,+ optparse-applicative >= 0.11 && < 0.15,+ syb >= 0.6,+ filepath >= 1.1.0.2,+ exact-combinatorics >= 0.2.0 ---------------------------------------------------------------- Executable hakaru@@ -237,8 +251,7 @@ text >= 0.11 && < 1.3, pretty >= 1.1 && < 1.2, vector >= 0.10,- optparse-applicative >= 0.11 && < 0.15,- hakaru >= 0.3+ optparse-applicative >= 0.11 && < 0.15 ---------------------------------------------------------------- Executable compile@@ -252,8 +265,7 @@ text >= 0.11 && < 1.3, pretty >= 1.1 && < 1.2, filepath >= 1.3,- optparse-applicative >= 0.11 && < 0.15,- hakaru >= 0.3+ optparse-applicative >= 0.11 && < 0.15 ---------------------------------------------------------------- Executable summary@@ -267,8 +279,7 @@ text >= 0.11 && < 1.3, pretty >= 1.1 && < 1.2, filepath >= 1.3,- optparse-applicative >= 0.11 && < 0.15,- hakaru >= 0.3+ optparse-applicative >= 0.11 && < 0.15 ---------------------------------------------------------------- Executable hk-maple@@ -282,8 +293,7 @@ text >= 0.11 && < 1.3, pretty >= 1.1 && < 1.2, optparse-applicative >= 0.13 && < 0.15,- containers >= 0.5 && < 0.6,- hakaru >= 0.3+ containers >= 0.5 && < 0.6 ---------------------------------------------------------------- Executable density@@ -295,8 +305,7 @@ build-depends: base >= 4.7 && < 5.0, mwc-random >= 0.13 && < 0.14, text >= 0.11 && < 1.3,- pretty >= 1.1 && < 1.2,- hakaru >= 0.3+ pretty >= 1.1 && < 1.2 ---------------------------------------------------------------- Executable disintegrate@@ -309,8 +318,7 @@ mwc-random >= 0.13 && < 0.14, text >= 0.11 && < 1.3, pretty >= 1.1 && < 1.2,- optparse-applicative >= 0.11 && < 0.15,- hakaru >= 0.3+ optparse-applicative >= 0.11 && < 0.15 ---------------------------------------------------------------- Executable pretty@@ -319,12 +327,24 @@ Default-Language: Haskell2010 GHC-Options: -O2 -Wall -fwarn-tabs - build-depends: base >= 4.7 && < 5.0,- text >= 0.11 && < 1.3,- pretty >= 1.1 && < 1.2,- hakaru >= 0.3+ build-depends: base >= 4.7 && < 5.0,+ text >= 0.11 && < 1.3,+ pretty >= 1.1 && < 1.2,+ optparse-applicative >= 0.11 && < 0.15 ----------------------------------------------------------------+Executable prettyinternal+ Main-is: PrettyInternal.hs+ Hs-Source-Dirs: commands+ Default-Language: Haskell2010+ GHC-Options: -O2 -Wall -fwarn-tabs++ build-depends: base >= 4.7 && < 5.0,+ text >= 0.11 && < 1.3,+ pretty >= 1.1 && < 1.2,+ optparse-applicative >= 0.11 && < 0.15++---------------------------------------------------------------- Executable momiji Main-is: Momiji.hs Hs-Source-Dirs: commands@@ -332,8 +352,7 @@ GHC-Options: -O2 -Wall -fwarn-tabs build-depends: base >= 4.7 && < 5.0,- text >= 0.11 && < 1.3,- hakaru >= 0.3+ text >= 0.11 && < 1.3 ---------------------------------------------------------------- Executable normalize@@ -346,8 +365,7 @@ mwc-random >= 0.13 && < 0.14, text >= 0.11 && < 1.3, mtl >= 2.1,- pretty >= 1.1 && < 1.2,- hakaru >= 0.3+ pretty >= 1.1 && < 1.2 ----------------------------------------------------------------@@ -364,8 +382,7 @@ optparse-applicative >= 0.11 && < 0.15, pretty >= 1.1 && < 1.2, process >= 1.1 && < 2.0,- semigroups >= 0.16,- hakaru >= 0.3+ semigroups >= 0.16 ----------------------------------------------------------------@@ -379,8 +396,7 @@ mwc-random >= 0.13 && < 0.14, text >= 0.11 && < 1.3, mtl >= 2.1,- pretty >= 1.1 && < 1.2,- hakaru >= 0.3+ pretty >= 1.1 && < 1.2 ---------------------------------------------------------------- ----------------------------------------------------------- fin.
haskell/Data/Number/Nat.hs view
@@ -1,5 +1,5 @@ -- TODO: merge with the Posta version. And release them as a standalone package-{-# LANGUAGE CPP #-}+{-# LANGUAGE CPP, DeriveDataTypeable #-} {-# OPTIONS_GHC -Wall -fwarn-tabs #-} ---------------------------------------------------------------- -- 2015.12.17@@ -25,13 +25,19 @@ import Data.Monoid (Monoid(..)) #endif +#if !(MIN_VERSION_base(4,11,0))+import Data.Semigroup+#endif++import Data.Data (Data, Typeable)+ ---------------------------------------------------------------- ---------------------------------------------------------------- -- | Natural numbers, with fixed-width à la 'Int'. N.B., the 'Num' -- instance will throw errors on subtraction, negation, and -- 'fromInteger' when the result is not a natural number. newtype Nat = Nat Int- deriving (Eq, Ord, Show)+ deriving (Eq, Ord, Show, Data, Typeable) -- TODO: should we define our own Show instance, in order to just -- show the Int itself, relying on our 'fromInteger' definition to@@ -138,10 +144,14 @@ ---------------------------------------------------------------- newtype MaxNat = MaxNat { unMaxNat :: Nat } -instance Monoid MaxNat where- mempty = MaxNat 0- mappend (MaxNat m) (MaxNat n) = MaxNat (max m n)+instance Semigroup MaxNat where+ MaxNat m <> MaxNat n = MaxNat (max m n) +instance Monoid MaxNat where+ mempty = MaxNat 0+#if !(MIN_VERSION_base(4,11,0))+ mappend = (<>)+#endif ---------------------------------------------------------------- _errmsg_unsafeNat, _errmsg_subtraction, _errmsg_negate, _errmsg_fromInteger, _errmsg_succ, _errmsg_pred, _errmsg_toEnum
haskell/Data/Number/Natural.hs view
@@ -28,6 +28,11 @@ #if __GLASGOW_HASKELL__ < 710 import Data.Monoid (Monoid(..)) #endif++#if !(MIN_VERSION_base(4,11,0))+import Data.Semigroup+#endif+ import Data.Ratio ----------------------------------------------------------------@@ -150,9 +155,14 @@ ---------------------------------------------------------------- newtype MaxNatural = MaxNatural { unMaxNatural :: Natural } +instance Semigroup MaxNatural where+ MaxNatural m <> MaxNatural n = MaxNatural (max m n)+ instance Monoid MaxNatural where- mempty = MaxNatural 0- mappend (MaxNatural m) (MaxNatural n) = MaxNatural (max m n)+ mempty = MaxNatural 0+#if !(MIN_VERSION_base(4,11,0))+ mappend = (<>)+#endif ----------------------------------------------------------------
haskell/Data/Text/Utf8.hs view
@@ -3,7 +3,6 @@ module Data.Text.Utf8 where import Prelude hiding (putStr, putStrLn)-import Control.Applicative (liftA) #if __GLASGOW_HASKELL__ < 710 import Control.Applicative (Applicative(..), (<$>))@@ -13,7 +12,6 @@ import qualified Data.Text as Text import Data.Text.Encoding (decodeUtf8, encodeUtf8) import System.IO (Handle)-import Data.Monoid ((<>)) readFile :: FilePath -> IO Text.Text readFile f = decodeUtf8 <$> (BIO.readFile f)
haskell/Language/Hakaru/CodeGen/AST.hs view
@@ -8,10 +8,11 @@ -- Stability : experimental -- Portability : GHC-only ----- An AST for the C Family and preprocessor--- Much of this is based on Manuel M T Chakravarty and Benedikt--- Hubar's "language-c" package+-- An AST for the C Family and preprocessor. Much of this was originally based+-- on Manuel M T Chakravarty and Benedikt Hubar's "language-c" package. --+-- It is an AST for the C99 standard and should compile with the -pedantic flag+-- -------------------------------------------------------------------------------- module Language.Hakaru.CodeGen.AST@@ -177,7 +178,7 @@ data CDirectDeclr = CDDeclrIdent Ident | CDDeclrArr CDirectDeclr (Maybe CExpr)- | CDDeclrFun CDirectDeclr [CTypeSpec]+ | CDDeclrFun CDirectDeclr [[CTypeSpec]] | CDDeclrRec CDeclr deriving (Show, Eq, Ord)
haskell/Language/Hakaru/CodeGen/CodeGenMonad.hs view
@@ -44,9 +44,9 @@ , extDeclareTypes , funCG- , isParallel- , mkParallel- , mkSequential+ , whenPar+ , parDo+ , seqDo , reserveIdent , genIdent@@ -81,7 +81,6 @@ import Language.Hakaru.Types.Sing import Language.Hakaru.CodeGen.Types import Language.Hakaru.CodeGen.AST-import Language.Hakaru.CodeGen.Pretty import Language.Hakaru.CodeGen.Libs import Data.Number.Nat (fromNat)@@ -89,23 +88,23 @@ import qualified Data.Text as T import qualified Data.Set as S -import Text.PrettyPrint (render)- -- CG after "codegen", holds the state of a codegen computation-data CG = CG { freshNames :: [String] -- ^ fresh names for code generations- , reservedNames :: S.Set String -- ^ reserve names during code generations- , extDecls :: [CExtDecl] -- ^ total external declarations- , declarations :: [CDecl] -- ^ declarations in local block- , statements :: [CStat] -- ^ statements can include assignments as well as other side-effects- , varEnv :: Env -- ^ mapping between Hakaru vars and codegeneration vars- , managedMem :: Bool -- ^ garbage collected block- , sharedMem :: Bool -- ^ shared memory supported block- , distributed :: Bool -- ^ distributed supported block- , logProbs :: Bool -- ^ true by default, but might not matter in some situations- }+data CG = CG+ { freshNames :: [String] -- ^ fresh names for code generations+ , reservedNames :: S.Set String -- ^ reserve names during code generations+ , extDecls :: [CExtDecl] -- ^ total external declarations+ , declarations :: [CDecl] -- ^ declarations in local block+ , statements :: [CStat] -- ^ statements can include assignments as well as other side-effects+ , varEnv :: Env -- ^ mapping between Hakaru vars and codegeneration vars+ , managedMem :: Bool -- ^ garbage collected block+ , sharedMem :: Bool -- ^ shared memory supported block (OpenMP)+ , simd :: Bool -- ^ support single instruction multiple data instructions (OpenMP)+ , distributed :: Bool -- ^ distributed supported block+ , logProbs :: Bool -- ^ true by default, but might not matter in some situations+ } emptyCG :: CG-emptyCG = CG cNameStream mempty mempty [] [] emptyEnv False False False True+emptyCG = CG cNameStream mempty mempty [] [] emptyEnv False False False False True type CodeGen = State CG @@ -132,18 +131,26 @@ -------------------------------------------------------------------------------- -isParallel :: CodeGen Bool-isParallel = sharedMem <$> get+whenPar :: CodeGen () -> CodeGen ()+whenPar m = (sharedMem <$> get) >>= (\b -> when b m) -mkParallel :: CodeGen ()-mkParallel =- do cg <- get- put (cg { sharedMem = True } )+parDo :: CodeGen a -> CodeGen a+parDo m = do+ cg <- get+ put (cg { sharedMem = True } )+ a <- m+ cg' <- get+ put (cg' { sharedMem = sharedMem cg } )+ return a -mkSequential :: CodeGen ()-mkSequential =- do cg <- get- put (cg { sharedMem = False } )+seqDo :: CodeGen a -> CodeGen a+seqDo m = do+ cg <- get+ put (cg { sharedMem = False } )+ a <- m+ cg' <- get+ put (cg' { sharedMem = sharedMem cg } )+ return a -------------------------------------------------------------------------------- @@ -267,27 +274,6 @@ else d:extds put $ cg { extDecls = extds' } -funCG :: CTypeSpec -> Ident -> [CDecl] -> CodeGen () -> CodeGen ()-funCG ts ident args m =- do cg <- get- let (_,cg') = runState m $ cg { statements = []- , declarations = []- , freshNames = cNameStream }- let decls = reverse . declarations $ cg'- stmts = reverse . statements $ cg'- -- reset local statements and declarations- put $ cg' { statements = statements cg- , declarations = declarations cg- , freshNames = freshNames cg }- extDeclare . CFunDefExt $- CFunDef [CTypeSpec ts]- (CDeclr Nothing (CDDeclrIdent ident))- args- (CCompound ((fmap CBlockDecl decls) ++ (fmap CBlockStat stmts)))---- --------- -- ENV -- ---------@@ -306,9 +292,35 @@ lookupVar (Variable _ nat _) (Env env) = IM.lookup (fromNat nat) env -------------------------------------------------------------------- Control Flow+--------------------------------------------------------------------------------+-- Control Flow and Code Blocks --+--------------------------------------------------------------------------------+{-+Monadic operations funCG, ifCG, whileCG, forCG, reductionCG, and codeBlockCG all+generate compound C statements (several declarations and statements surrounded+by '{' '}'). It is important that these code blocks float external functions and+imports to the top of the generated C file AND keep a set of the variable+declarations local to the block of code.+-} +funCG :: [CTypeSpec] -> Ident -> [CDecl] -> CodeGen () -> CodeGen ()+funCG ts ident args m =+ do cg <- get+ let (_,cg') = runState m $ cg { statements = []+ , declarations = []+ , freshNames = cNameStream }+ let decls = reverse . declarations $ cg'+ stmts = reverse . statements $ cg'+ -- reset local statements and declarations+ put $ cg' { statements = statements cg+ , declarations = declarations cg+ , freshNames = freshNames cg }+ extDeclare . CFunDefExt $+ CFunDef (fmap CTypeSpec ts)+ (CDeclr Nothing (CDDeclrIdent ident))+ args+ (CCompound ((fmap CBlockDecl decls) ++ (fmap CBlockStat stmts)))+ ifCG :: CExpr -> CodeGen () -> CodeGen () -> CodeGen () ifCG bE m1 m2 = do cg <- get@@ -361,9 +373,7 @@ put $ cg' { statements = statements cg , declarations = declarations cg , sharedMem = sharedMem cg } -- only use pragmas at the top level- par <- isParallel- when par . putStat . CPPStat . PPPragma- $ ["omp","parallel","for"]+ whenPar . putStat . CPPStat . ompToPP $ OMP (Parallel [For]) putStat $ CFor (Just iter) (Just cond) (Just inc)@@ -371,54 +381,79 @@ ++ (fmap CBlockStat (reverse $ statements cg')))) {--The operation for a reduction is either a builtin binary op, or must be-specified+The operation for a reduction is either a builtin binary op (which is a built+in OpenMP reducer),++OR, it must be specified for a given Hakaru type. This will generate fuctions+for the monoidal operations mempty and mappend, use these to generate OpenMP+reduction declarations, and then outfit a for loop with the pragma calling the+reduction. -} reductionCG- :: Either CBinaryOp (CExpr -> CExpr -> CExpr)- -> Ident- -> CExpr- -> CExpr- -> CExpr- -> CodeGen ()+ :: Either CBinaryOp+ ( Sing (a :: Hakaru) -- type of reduction sections+ , CExpr -> CodeGen () -- monoidal unit+ , CExpr -> CExpr -> CodeGen () ) -- monoidal multiplication+ -> CExpr -- accumulator var+ -> CExpr -- iteration var+ -> CExpr -- iteration condition+ -> CExpr -- iteration increment+ -> CodeGen () -- body of the loop -> CodeGen () reductionCG op acc iter cond inc body = do cg <- get- let (_,cg') = runState body $ cg { statements = []+ let (_,cg') = runState body $ cg { statements = [] , declarations = []- , sharedMem = False } -- only use pragmas at the top level+ , sharedMem = False } -- only use pragmas at the top level put $ cg' { statements = statements cg , declarations = declarations cg , sharedMem = sharedMem cg }- par <- isParallel- when par $+ whenPar $ case op of- Left binop -> putStat . CPPStat . PPPragma $- [ "omp","parallel","for","reduction("- , render . pretty $ binop- , ":"- , render . pretty $ acc- ,")"]- -- INCOMPLETE- Right red -> do (Ident redName) <- genIdent' "red"- let declRedPragma = [ "omp","declare","reduction("- , redName,":",undefined,":"- , render . pretty $- red (CVar . Ident $ "omp_in")- (CVar . Ident $ "omp_out")- , ")"]- redPragma = [ "omp","parallel","for","reduction("- , redName- , ":"- , render . pretty $ acc- ,")"]- putStat . CPPStat . PPPragma $ declRedPragma- putStat . CPPStat . PPPragma $ redPragma+ Left binop ->+ putStat . CPPStat . ompToPP $+ OMP (Parallel [For,Reduction (Left binop) [acc]])+ Right (typ,unit,mul) ->+ do { redId <- declareReductionCG typ unit mul+ ; putStat . CPPStat . ompToPP $+ OMP (Parallel [For,Reduction (Right redId) [acc]]) } putStat $ CFor (Just iter) (Just cond) (Just inc) (CCompound $ (fmap CBlockDecl (reverse $ declarations cg') ++ (fmap CBlockStat (reverse $ statements cg'))))++-- given a monoid for a Hakaru type, generate the appropriate openMP reduction+-- declaration and return its unique identifier+declareReductionCG+ :: Sing (a :: Hakaru)+ -> (CExpr -> CodeGen ())+ -> (CExpr -> CExpr -> CodeGen ())+ -> CodeGen Ident+declareReductionCG typ unit mul =+ do (redId:unitId:mulId:[]) <- mapM genIdent' ["red","unit","mul"]+ let declType = typePtrDeclaration typ++ inId <- genIdent' "in"+ funCG [CVoid] unitId [declType inId] $+ unit . CVar $ inId++ (outId:in2Id:[]) <- mapM genIdent' ["out","in"]+ funCG [CVoid] mulId [declType outId,declType in2Id] $+ mul (CVar outId) (CVar in2Id)++ let typ' = case buildType typ of+ (x:_) -> x+ _ -> error $ "buildType{" ++ (show typ) ++ "}"+ putStat . CPPStat . ompToPP $+ OMP (DeclareRed redId+ typ'+ (CCall (CVar mulId)+ (fmap (address . CVar . Ident)+ ["omp_in","omp_out"]))+ (CCall (CVar unitId)+ [address . CVar . Ident $ "omp_priv"]))+ return redId -- not control flow, but like these it creates a block with local variables
haskell/Language/Hakaru/CodeGen/Flatten.hs view
@@ -45,18 +45,15 @@ import Language.Hakaru.Syntax.TypeOf import Language.Hakaru.Syntax.Datum hiding (Ident) import Language.Hakaru.Syntax.Reducer+import Language.Hakaru.Syntax.IClasses import qualified Language.Hakaru.Syntax.Prelude as HKP import Language.Hakaru.Types.DataKind import Language.Hakaru.Types.HClasses-import Language.Hakaru.Syntax.IClasses import Language.Hakaru.Types.Coercion import Language.Hakaru.Types.Sing import Control.Monad.State.Strict-import Control.Monad (replicateM)-import Control.Applicative (pure) import Data.Number.Natural-import Data.Monoid hiding (Product,Sum) import Data.Ratio import qualified Data.List.NonEmpty as NE import qualified Data.Sequence as S@@ -65,7 +62,10 @@ #if __GLASGOW_HASKELL__ < 710+import Control.Applicative (pure)+import Control.Monad (replicateM) import Data.Functor+import Data.Monoid hiding (Product,Sum) #endif @@ -171,27 +171,48 @@ \loc -> do caseBind body $ \v@(Variable _ _ typ) body'-> do ident <- createIdent v- case typ of- (SFun _ _) -> return ()- _ -> declare typ ident+ declare typ ident flattenABT expr (CVar ident) flattenABT body' loc -- Lambdas produce functions and then return a function label exprssion flattenSCon Lam_ = \(body :* End) ->- \loc -> do- -- externally declare closure and function- closureTypeSpec <- coalesceLambda body extDeclClosure-- -- declare local closure var- closureId <- genIdent' "closure"- declare' (buildDeclaration closureTypeSpec closureId)+ \loc ->+ coalesceLambda body $ \args body' ->+ let freevars = fromVarSet . freeVars $ body'+ retTyp = typeOf body'+ in do { -- create code block and closure structure+ args' <- sequence . foldMap11 argDecl $ args+ ; envId <- genIdent' "env"+ ; fnId <- genIdent' "fn"+ ; closDataId@(Ident clos_n) <- genIdent' "clos_data"+ ; extDeclare (closureStructure freevars args closDataId retTyp)+ ; funCG (buildType retTyp)+ fnId+ ((buildDeclaration (callStruct clos_n) envId):args') $+ do { putStat (opComment "Begin Unpack Closure")+ -- need to re-declare variables in functions scope+ ; mapM_ (\(SomeVariable v@(Variable _ _ typ)) ->+ lookupIdent v >>= declare typ)+ freevars+ ; unpackClosure (CVar envId) cNameStream freevars+ ; putStat (opComment "End Unpack Closure")+ ; x <- flattenWithName body'+ ; putStat . CReturn . Just $ x } - -- capture environment in closure- putExprStat $ loc .=. (CVar closureId)+ -- create the closure object+ ; closureId <- genIdent' "closure"+ ; declare' . buildDeclaration (callStruct clos_n) $ closureId+ ; putStat (opComment "Begin Pack Closure")+ ; putExprStat $ ((CVar closureId) ... "_code_ptr") .=. (address (CVar fnId))+ ; packClosure (CVar closureId) cNameStream freevars+ ; putStat (opComment "End Pack Closure")+ ; putExprStat $ loc .=. (CVar closureId) } - where coalesceLambda+ where -- collapses nested lambdas of one argument to lambdas that take a list+ -- arguments+ coalesceLambda :: ( ABT Term abt ) => abt '[x] a -> (forall (ys :: [Hakaru]) b. List1 Variable ys -> abt '[] b -> r)@@ -204,65 +225,37 @@ coalesceLambda body $ \vars abt'' -> k (Cons1 v vars) abt'' _ -> k (Cons1 v Nil1) abt' - -- given a parameter, create identifiers corresponding to Hakaru vars,- -- and return a CTypeSpec for the param- -- Will this fail if the parameter is a SFun?- mkVarIdandSpec :: Variable (a :: Hakaru) -> CodeGen (Ident,[CTypeSpec])- mkVarIdandSpec v@(Variable _ _ typ) = do- extDeclareTypes typ- vId <- createIdent v- return (vId,buildType typ)+ argDecl :: Variable (a :: Hakaru) -> [CodeGen CDecl]+ argDecl v@(Variable _ _ typ) =+ [do { ident <- createIdent v ; return (typeDeclaration typ ident) }] - extDeclClosure- :: ( ABT Term abt )- => List1 Variable (ys :: [Hakaru])- -> abt '[] b- -> CodeGen CTypeSpec- extDeclClosure vars body'= do- funcId <- genIdent' "fn"- idAndSpecs <- sequence $ foldMap11 (\v -> [mkVarIdandSpec v]) vars- let fVars = freeVars body'- typ = typeOf body'- sId@(Ident sname) <- extDeclClosureStruct typ (fmap snd idAndSpecs) fVars- funCG (head . buildType $ typ)- funcId- ([buildDeclaration (callStruct sname) (Ident "env")]- ++ (fmap (\(vId,specs) -> buildDeclaration' specs vId) idAndSpecs))- ((putStat . CReturn . Just) =<< flattenWithName body')- return (callStruct sname)+ -- captures the environment variables in closure object+ packClosure, unpackClosure+ :: CExpr+ -> [String]+ -> [SomeVariable (KindOf (a :: Hakaru))]+ -> CodeGen ()+ packClosure _ _ [] = return ()+ packClosure c (n:ns) ((SomeVariable a):as) =+ do { a' <- CVar <$> lookupIdent a+ ; putExprStat $ c ... n .=. a'+ ; packClosure c ns as }+ packClosure _ _ _ = error "this isn't possible" - extDeclClosureStruct- :: forall (a :: Hakaru) (ys :: [Hakaru])- . Sing a- -> [[CTypeSpec]]- -> VarSet (KindOf a)- -> CodeGen Ident- extDeclClosureStruct retTyp paramTypeSpecs freeVars = do- sId@(Ident sname) <- genIdent' "clos"- freeVarDecls <- mapM (\(SomeVariable v@(Variable _ _ typ)) -> do- extDeclareTypes typ- vId <- createIdent v- return (typeDeclaration typ vId)- ) (fromVarSet freeVars)- let funPtrDecl =- CDecl (fmap CTypeSpec $ buildType retTyp)- [( CDeclr Nothing- (CDDeclrFun- (CDDeclrRec (CDeclr (Just $ CPtrDeclr []) (CDDeclrIdent . Ident $ "fn")))- ([callStruct sname]++(concat paramTypeSpecs)))- , Nothing)]- extDeclare $ CDeclExt- $ CDecl [ CTypeSpec $ buildStruct (Just sId)- ([funPtrDecl]++freeVarDecls) ]- []- return sId+ unpackClosure _ _ [] = return ()+ unpackClosure c (n:ns) ((SomeVariable a):as) =+ do { a' <- CVar <$> lookupIdent a+ ; putExprStat $ a' .=. c ... n+ ; unpackClosure c ns as }+ unpackClosure _ _ _ = error "this isn't possible" flattenSCon App_ = \(fun :* arg :* End) ->- \loc -> do- closE <- flattenWithName' fun "clos"- paramE <- flattenWithName' fun "param"- putExprStat $ loc .=. (CCall (CMember closE (Ident "fn") True) [paramE])+ \loc ->+ do { closE <- flattenWithName' fun "closure"+ ; paramE <- flattenWithName' arg "param"+ ; putExprStat $ loc .=. CCall (indirect (closE ... "_code_ptr"))+ [closE,paramE] } flattenSCon (PrimOp_ op) = flattenPrimOp op @@ -306,7 +299,7 @@ iterVar = CVar iterI reductionCG (Left CAddOp)- accI+ accVar (iterVar .=. loE) (iterVar .<. hiE) (CUnary CPostIncOp iterVar) $@@ -345,7 +338,7 @@ iterVar = CVar iterI reductionCG (Left CMulOp)- accI+ accVar (iterVar .=. loE) (iterVar .<. hiE) (CUnary CPostIncOp iterVar) $@@ -404,7 +397,7 @@ flattenSCon Plate = \(size :* b :* End) -> \loc ->- caseBind b $ \v@(Variable _ _ typ) body ->+ caseBind b $ \v body -> do sizeE <- flattenWithName' size "s" isMM <- managedMem <$> get when (not isMM) (error "plate will leak memory without the '-g' flag and boehm-gc")@@ -426,7 +419,7 @@ let sampE = CVar sampId reductionCG (Left CAddOp)- weightId+ weightE (itE .=. (intE 0)) (itE .<. sizeE) (CUnary CPostIncOp itE)@@ -557,9 +550,9 @@ => abt '[] a -> Integer -> (CExpr -> CodeGen ())- assignIndex e index loc = do+ assignIndex e i loc = do eE <- flattenWithName e- putExprStat $ indirect ((arrayData loc) .+. (intE index)) .=. eE+ putExprStat $ indirect ((arrayData loc) .+. (intE i)) .=. eE -------------- -- ArrayOps --@@ -647,11 +640,21 @@ declare SNat itId let itE = CVar itId initRed red loc- forCG (itE .=. loE)- (itE .<. hiE)- (CUnary CPostIncOp itE)- (accumRed red itE loc)+ isPar <- sharedMem <$> get+ -- declare special functions for combining threads. This doesn't completely+ -- work now, because these need to capture free variables.+ reductionCG (Right ( typeOfReducer red+ , \e -> seqDo ( initRed red (indirect e)+ >> putStat (CReturn Nothing))+ , \a b -> seqDo ( mulRed red (indirect a) (indirect b)+ >> putStat (CReturn Nothing))))+ loc+ (itE .=. loE)+ (itE .<. hiE)+ (CUnary CPostIncOp itE)+ (accumRed isPar red itE loc) putStat $ opComment "End Bucket"+ where initRed :: (ABT Term abt) => Reducer abt xs a@@ -670,7 +673,7 @@ (Variable _ _ typ') -> [declare typ' =<< createIdent v']) $ vs- sE <- flattenWithName s'+ sE <- flattenWithName' s' "red_size" putExprStat $ arraySize loc .=. sE putMallocStat (arrayData loc) sE btyp itId <- genIdent@@ -686,10 +689,11 @@ accumRed :: (ABT Term abt)- => Reducer abt xs a+ => Bool+ -> Reducer abt xs a -> CExpr -> (CExpr -> CodeGen ())- accumRed mr itE = \loc ->+ accumRed isPar mr itE = \loc -> case mr of (Red_Index _ a body) -> caseBind a $ \v@(Variable _ _ typ) a' ->@@ -703,9 +707,9 @@ [declare typ' =<< createIdent v']) $ vs aE <- flattenWithName' a'' "index"- accumRed body itE (index (arrayData loc) aE)- (Red_Fanout mr1 mr2) -> accumRed mr1 itE (datumFst loc)- >> accumRed mr2 itE (datumSnd loc)+ accumRed isPar body itE (index (arrayData loc) aE)+ (Red_Fanout mr1 mr2) -> accumRed isPar mr1 itE (datumFst loc)+ >> accumRed isPar mr2 itE (datumSnd loc) (Red_Split b mr1 mr2) -> caseBind b $ \v@(Variable _ _ typ) b' -> let (vs,b'') = caseBinds b' in@@ -719,8 +723,8 @@ $ vs bE <- flattenWithName' b'' "cond" ifCG (bE ... "index" .==. (intE 0))- (accumRed mr1 itE (datumFst loc))- (accumRed mr2 itE (datumSnd loc))+ (accumRed isPar mr1 itE (datumFst loc))+ (accumRed isPar mr2 itE (datumSnd loc)) Red_Nop -> return () (Red_Add sr e) -> caseBind e $ \v@(Variable _ _ typ) e' ->@@ -734,10 +738,32 @@ [declare typ' =<< createIdent v']) $ vs eE <- flattenWithName e''+ -- when isPar $ putStat . CPPStat . ompToPP $ OMP Critical case sing_HSemiring sr of SProb -> logSumExpCG (S.fromList [loc,eE]) loc _ -> putExprStat $ loc .+=. eE + mulRed+ :: (ABT Term abt)+ => Reducer abt xs a+ -> (CExpr -> CExpr -> CodeGen ())+ mulRed mr outp inp =+ case mr of+ (Red_Index _ _ mr') ->+ do itE <- localVar SNat+ forCG (itE .=. (intE 0))+ (itE .<. (intE 0))+ (CUnary CPostIncOp itE)+ (mulRed mr'+ (index (arrayData outp) itE)+ (index (arrayData inp) itE))+ (Red_Fanout mr1 mr2) -> mulRed mr1 (datumFst outp) (datumFst inp)+ >> mulRed mr2 (datumFst outp) (datumFst inp)+ (Red_Split _ mr1 mr2) -> mulRed mr1 (datumFst outp) (datumFst inp)+ >> mulRed mr2 (datumFst outp) (datumFst inp)+ Red_Nop -> return ()+ (Red_Add _ _) -> putExprStat $ outp .+=. inp+ addMonoidIdentity :: Sing (a :: Hakaru) -> CExpr addMonoidIdentity s = case s of@@ -775,9 +801,9 @@ -> CExpr -> CodeGen () assignDatum code ident =- let index = getIndex code- indexExpr = CMember ident (Ident "index") True- in do putExprStat (indexExpr .=. (intE index))+ let ind = getIndex code+ indExpr = CMember ident (Ident "index") True+ in do putExprStat (indExpr .=. (intE ind)) sequence_ $ assignSum code ident where getIndex :: DatumCode xss b c -> Integer getIndex (Inl _) = 0@@ -831,6 +857,7 @@ True rest' <- assignProd' rest topIdent (CVar sumIdent) return $ [flattenABT d varName] ++ rest'+ assignProd' _ _ _ = error $ "TODO: assignProd Ident" @@ -897,8 +924,7 @@ do aE <- flattenWithName a bId <- genIdent declare (typeOf a) bId- let datumIndex e = CMember e (Ident "index") True- bE = CVar bId+ let bE = CVar bId putExprStat $ datumIndex bE .=. (CCond (datumIndex aE .==. (intE 1)) (intE 0) (intE 1))@@ -990,6 +1016,8 @@ do aE <- flattenWithName a putExprStat $ loc .=. (CUnary CMinOp $ aE) +flattenPrimOp Choose = \(_ :* _ :* End) -> error $ "TODO: flattenPrimOp: choose"+ flattenPrimOp t = \_ -> error $ "TODO: flattenPrimOp: " ++ show t @@ -1235,40 +1263,36 @@ let currE = index (arrayData arrE) itE - isPar <- isParallel- mkSequential-- -- Calculate the maximum value of the input array- -- And calculate the total weight- forCG (itE .=. (intE 0))- (itE .<. (arraySize arrE))- (CUnary CPostIncOp itE) $ do- ifCG (wMaxE .<. currE)- (putExprStat $ wMaxE .=. currE)- (return ())- logSumExpCG (S.fromList [wSumE, currE]) wSumE- putExprStat $ wSumE .=. (wSumE .-. wMaxE)-- -- draw number from uniform(0, weightSum)- rId <- genIdent' "r"- declare SReal rId- let r = castTo [CDouble] randE- rMax = castTo [CDouble] (CVar . Ident $ "RAND_MAX")- rE = CVar rId- assign rId (logE (r ./. rMax) .+. wSumE)+ seqDo $ do+ -- Calculate the maximum value of the input array+ -- And calculate the total weight+ forCG (itE .=. (intE 0))+ (itE .<. (arraySize arrE))+ (CUnary CPostIncOp itE) $ do+ ifCG (wMaxE .<. currE)+ (putExprStat $ wMaxE .=. currE)+ (return ())+ logSumExpCG (S.fromList [wSumE, currE]) wSumE+ putExprStat $ wSumE .=. (wSumE .-. wMaxE) - assign wSumId (logE (intE 0))- assign itId (intE 0)- whileCG (intE 1) $- do ifCG (rE .<. wSumE)- (do putExprStat $ mdataWeight loc .=. (intE 0)- putExprStat $ mdataSample loc .=. (itE .-. (intE 1))- putStat CBreak)- (return ())- logSumExpCG (S.fromList [wSumE, currE .-. wMaxE]) wSumE- putExprStat $ CUnary CPostIncOp itE+ -- draw number from uniform(0, weightSum)+ rId <- genIdent' "r"+ declare SReal rId+ let r = castTo [CDouble] randE+ rMax = castTo [CDouble] (CVar . Ident $ "RAND_MAX")+ rE = CVar rId+ assign rId (logE (r ./. rMax) .+. wSumE) - when isPar mkParallel+ assign wSumId (logE (intE 0))+ assign itId (intE 0)+ whileCG (intE 1) $+ do ifCG (rE .<. wSumE)+ (do putExprStat $ mdataWeight loc .=. (intE 0)+ putExprStat $ mdataSample loc .=. (itE .-. (intE 1))+ putStat CBreak)+ (return ())+ logSumExpCG (S.fromList [wSumE, currE .-. wMaxE]) wSumE+ putExprStat $ CUnary CPostIncOp itE flattenMeasureOp x = error $ "TODO: flattenMeasureOp: " ++ show x@@ -1395,7 +1419,7 @@ let argIds = fmap Ident (take size cNameStream) decls = fmap (typeDeclaration SProb) argIds vars = fmap CVar argIds- funCG CDouble funcId decls+ funCG [CDouble] funcId decls (putStat . CReturn . Just . logSumExp . S.fromList $ vars) putExprStat $ loc .=. (CCall (CVar funcId) (F.toList seqE)) @@ -1403,10 +1427,8 @@ -- LogSumExp for Summation of Prob -- ------------------------------------- {-- For summation of SProb we need a new logSumExp function that will find the max of an array and then sum it in a loop- -} lseSummateArrayCG@@ -1416,7 +1438,7 @@ -> (CExpr -> CodeGen ()) lseSummateArrayCG body arrayE = caseBind body $ \v body' ->- \loc -> do+ \loc -> seqDo $ do (maxVId:maxIId:sumId:[]) <- mapM genIdent' ["maxV","maxI","sum"] itId <- createIdent v mapM_ (declare SProb) [maxVId,sumId]@@ -1439,9 +1461,9 @@ forCG (itE .=. intE 0) (itE .<. arraySize arrayE) (CUnary CPostIncOp itE)- (putStat $ CIf (itE .!=. maxIE)- (CExpr . Just $ sumE .+=. (expE ((derefIndex itE) .-. (maxVE))))- Nothing)+ (ifCG (itE .!=. maxIE)+ (putExprStat $ sumE .+=. (expE ((derefIndex itE) .-. (maxVE))))+ (return ())) putExprStat $ loc .=. (maxVE .+. (log1pE sumE)) @@ -1477,35 +1499,16 @@ flattenABT body' xE putExprStat $ yE .=. (xE .-. cE) putExprStat $ zE .=. (tE .+. yE)- putExprStat $ cE .=. ((zE .-. tE) .-. yE)- putExprStat $ tE .=. zE)+ whenPar $ putStat . CPPStat . ompToPP $ OMP Critical+ codeBlockCG $ do+ putExprStat $ cE .=. ((zE .-. tE) .-. yE)+ putExprStat $ tE .=. zE) putExprStat $ loc .=. tE -------------------------------------------------------------------------------- -- Coercion Helpers -- -------------------------------------------------------------------------------- --- instance PrimCoerce Value where--- primCoerceTo c l =--- case (c,l) of--- (Signed HRing_Int, VNat a) -> VInt $ fromNat a--- (Signed HRing_Real, VProb a) -> VReal $ LF.fromLogFloat a--- (Continuous HContinuous_Prob, VNat a) ->--- VProb $ LF.logFloat (fromIntegral (fromNat a) :: Double)--- (Continuous HContinuous_Real, VInt a) -> VReal $ fromIntegral a--- _ -> error "no a defined primitive coercion"---- primCoerceFrom c l =--- case (c,l) of--- (Signed HRing_Int, VInt a) -> VNat $ unsafeNat a--- (Signed HRing_Real, VReal a) -> VProb $ LF.logFloat a--- (Continuous HContinuous_Prob, VProb a) ->--- VNat $ unsafeNat $ floor (LF.fromLogFloat a :: Double)--- (Continuous HContinuous_Real, VReal a) -> VInt $ floor a--- _ -> error "no a defined primitive coercion"--- coerceToCG :: forall (a :: Hakaru) (b :: Hakaru) . Coercion a b@@ -1562,3 +1565,27 @@ (putExprStat $ x' .=. (logE x)) return x' real2int x = return (castTo [CInt] x)++--------------------------------------------------------------------------------+-- Parallel Helpers --+--------------------------------------------------------------------------------+{- SIMD (single instruction multiple data) OpenMP pragmas, should be applied to+-- the inner most loop. `hasParallelTerm` checks whether a term or any of its+-- subterms contain a parallel construct { plate, summate, product, array,+-- bucket }.+-}++hasParallelTerm :: ( ABT Term abt ) => abt '[] a -> Bool+hasParallelTerm abt = caseVarSyn abt (const False) hPT'+ where hPT' :: ABT Term abt => Term abt a -> Bool+ hPT' (_ :$ _) = undefined+ hPT' (NaryOp_ _ _) = undefined+ hPT' (Literal_ _) = False+ hPT' (Empty_ _) = False+ hPT' (Array_ _ _) = True+ hPT' (ArrayLiteral_ _) = False+ hPT' (Bucket _ _ _) = True+ hPT' (Datum_ _) = False+ hPT' (Case_ _ _) = undefined+ hPT' (Superpose_ _) = undefined+ hPT' (Reject_ _) = False
haskell/Language/Hakaru/CodeGen/Libs.hs view
@@ -27,10 +27,13 @@ gcHeader, gcInit, gcMalloc, -- OpenMP- openMpHeader, ompGetNumThreads, ompGetThreadNum,+ openMpHeader, ompGetNumThreads, ompGetThreadNum, OMP(..), Directive(..),+ ompToPP ) where import Language.Hakaru.CodeGen.AST+import Language.Hakaru.CodeGen.Pretty+import Text.PrettyPrint (render) {- @@ -129,6 +132,8 @@ For generating pragmas for shared memory parallelism, that is parallelism on on a single process that makes use of multithreaded processors. This interface is implemented in most C compilers and is accessed through pragmas++ This is a subset of the the OpenMP 4.5 standard. -} openMpHeader :: Preprocessor@@ -139,3 +144,30 @@ ompGetThreadNum :: CExpr ompGetThreadNum = mkCallE "omp_get_thread_num" []++data OMP = OMP Directive++data Directive+ = Parallel [Directive]+ | For+ | Critical+ | Reduction (Either CBinaryOp Ident) [CExpr]+ | DeclareRed Ident CTypeSpec CExpr CExpr++ompToPP :: OMP -> Preprocessor+ompToPP (OMP d) = PPPragma $ "omp":(showDirective d)+ where showDirective :: Directive -> [String]+ showDirective (Parallel ds) = "parallel":(concatMap showDirective ds)+ showDirective For = ["for"]+ showDirective Critical = ["critical"]+ showDirective (Reduction eop vs) =+ let op = case eop of+ Left binop -> render . pretty $ binop+ Right (Ident s) -> s+ in ["reduction(",op,":",unwords . fmap (render. pretty) $ vs,")"]+ showDirective (DeclareRed (Ident name) typ mul unit) =+ let typ' = render . pretty $ typ+ mul' = render . pretty $ mul+ unit' = render . pretty $ unit+ in ["declare","reduction(",name,":",typ',":",mul',") initializer ("+ ,unit',")"]
haskell/Language/Hakaru/CodeGen/Pretty.hs view
@@ -18,6 +18,7 @@ , Pretty ) where +import Prelude hiding ((<>)) import Text.PrettyPrint import Language.Hakaru.CodeGen.AST @@ -43,8 +44,8 @@ parensPrec :: Int -> Int -> Doc -> Doc parensPrec x y = if x <= y then parens else id -newline :: Doc-newline = char '\n'+emptyText :: Doc+emptyText = text "" instance Pretty a => Pretty (Maybe a) where pretty Nothing = empty@@ -59,11 +60,11 @@ pretty (Ident i) = text i instance Pretty CAST where- pretty (CAST extdecls) = (vcat . fmap pretty $ extdecls) $$ newline+ pretty (CAST extdecls) = vcat . fmap pretty $ extdecls instance Pretty CExtDecl where- pretty (CDeclExt d) = newline <> pretty d <> semi- pretty (CFunDefExt f) = newline <> pretty f+ pretty (CDeclExt d) = emptyText $+$ pretty d <> semi+ pretty (CFunDefExt f) = emptyText $+$ pretty f pretty (CCommentExt s) = text "/*" <+> text s <+> text "*/" pretty (CPPExt p) = pretty p @@ -72,7 +73,7 @@ ((hsep . fmap pretty $ dspecs) <+> pretty dr <> (parens . hsep . punctuate comma . fmap pretty $ ds))- $+$ pretty s+ $+$ (pretty s) -------------------------------------------------------------------------------- -- Preprocessor --@@ -114,7 +115,7 @@ pretty (CDDeclrIdent i) = pretty i pretty (CDDeclrArr dd e) = pretty dd <+> (brackets . pretty $ e) pretty (CDDeclrFun dd ts) =- pretty dd <> (parens . hsep . punctuate comma . fmap pretty $ ts)+ pretty dd <> (parens . hsep . punctuate comma . fmap (hsep . fmap pretty) $ ts) pretty (CDDeclrRec declr) = parens . pretty $ declr @@ -160,9 +161,10 @@ pretty (CSUSpec tag mi []) = pretty tag <+> mpretty mi pretty (CSUSpec tag mi ds) =- (pretty tag <+> mpretty mi <+> lbrace)- $+$ (nest (-1) $ (nest 2 . sep . fmap (\d -> pretty d <> semi) $ ds)- $+$ rbrace)+ (pretty tag <+> pretty mi)+ $+$ ( lbrace+ $+$ (nest 2 . sep . fmap (\d -> pretty d <> semi) $ ds)+ $+$ rbrace ) instance Pretty CSUTag where pretty CStructTag = text "struct"@@ -192,25 +194,25 @@ pretty (CDefault s) = text "default" <> colon $$ nest 2 (pretty s) pretty (CExpr me) = mpretty me <> semi pretty (CCompound bs) =- nest (-1) (lbrace $+$ (nest 2 . vcat . fmap pretty $ bs) $+$ rbrace)+ lbrace $+$ (nest 2 . vcat . fmap pretty $ bs) $+$ rbrace - pretty (CIf ce thns (Just elss)) = nest 1 $+ pretty (CIf ce thns (Just elss)) = text "if" <+> (parens . prettyPrec (-5) $ ce)- $+$ (nest 1 $ pretty thns)+ $+$ (pretty thns) $+$ text "else"- $+$ (nest 1 $ pretty elss)+ $+$ (pretty elss) pretty (CIf ce thns Nothing) =- text "if" <+> (parens . prettyPrec (-5) $ ce) $+$ (nest 1 $ pretty thns)+ text "if" <+> (parens . prettyPrec (-5) $ ce) $+$ (pretty thns) pretty (CWhile ce s b) = if b- then text "do" <+> pretty s <+> text "while" <+> (parens $ pretty ce) <> semi- else text "while" <+> (parens $ pretty ce) $$ (nest 1 $ pretty s)+ then text "do" $+$ pretty s $+$ (text "while" <+> (parens $ pretty ce) <> semi)+ else (text "while" <+> (parens $ pretty ce)) $+$ (pretty s) pretty (CFor me mce mie s) = text "for" <+> (parens . hsep . punctuate semi . fmap (mPrettyPrec 10) $ [me,mce,mie])- $$ (nest 1 $ pretty s)+ $$ (pretty s) pretty CCont = text "continue" <> semi pretty CBreak = text "break" <> semi
haskell/Language/Hakaru/CodeGen/Types.hs view
@@ -1,6 +1,7 @@ {-# LANGUAGE DataKinds, FlexibleContexts, GADTs,+ RankNTypes, KindSignatures #-} ----------------------------------------------------------------@@ -52,10 +53,11 @@ , datumProd , datumFst , datumSnd+ , datumIndex -- functions and closures , functionDef- , closureDeclaration+ , closureStructure , buildType , castTo@@ -68,7 +70,9 @@ import Control.Monad.State +import Language.Hakaru.Syntax.ABT import Language.Hakaru.Syntax.AST+import Language.Hakaru.Syntax.IClasses import Language.Hakaru.Types.DataKind import Language.Hakaru.Types.HClasses import Language.Hakaru.Types.Sing@@ -262,10 +266,10 @@ datumSum dat funs ident = let declrs = fst $ runState (datumSum' dat funs) cNameStream union = buildDeclaration (buildUnion declrs) (Ident "sum")- index = buildDeclaration CInt (Ident "index")+ ind = buildDeclaration CInt (Ident "index") struct = buildStruct (Just ident) $ case declrs of- [] -> [index]- _ -> [index,union]+ [] -> [ind]+ _ -> [ind,union] in CDecl [ CTypeSpec struct ] [] datumSum'@@ -326,6 +330,9 @@ datumSnd :: CExpr -> CExpr datumSnd x = x ... "sum" ... "a" ... "b" +datumIndex :: CExpr -> CExpr+datumIndex x = x ... "index"+ -------------------------------------------------------------------------------- -- Functions -- --------------------------------------------------------------------------------@@ -353,11 +360,32 @@ -- Closures -- -------------- -closureDeclaration- :: (Sing (a :: Hakaru))- -> Ident- -> CDecl-closureDeclaration = buildDeclaration . callStruct . typeName+-- externally declare closure structure+closureStructure+ :: forall (a :: Hakaru) xs+ . [SomeVariable (KindOf a)] -- ^ free variables+ -> List1 Variable (xs :: [Hakaru]) -- ^ function arguments+ -> Ident -- ^ identifier of function+ -> Sing a -- ^ function return type+ -> CExtDecl+closureStructure fvs as i@(Ident name) typ = CDeclExt $+ (CDecl [CTypeSpec $ (buildStruct (Just i) (codePtr:(declFvs cNameStream fvs)))]+ [])+ where declFvs _ [] = []+ declFvs (n:ns) ((SomeVariable (Variable _ _ typ')):as') =+ typeDeclaration typ' (Ident n) : declFvs ns as'+ declFvc [] (_:_) = error "Ran out of identifiers but still had some types to assign"+ codePtr = CDecl (fmap CTypeSpec . buildType $ typ)+ [(CDeclr Nothing+ (CDDeclrFun+ (CDDeclrRec+ (CDeclr (Just . CPtrDeclr $ [])+ (CDDeclrIdent . Ident $ "_code_ptr")))+ ([callStruct name]:(varTypes as)))+ ,Nothing)]++ varTypes :: List1 Variable (xs :: [Hakaru]) -> [[CTypeSpec]]+ varTypes = foldMap11 (\(Variable _ _ typ') -> [buildType typ'])
haskell/Language/Hakaru/CodeGen/Wrapper.hs view
@@ -72,7 +72,7 @@ ( TypedAST typ' abt, Just name ) -> -- still buggy for measures do mfId <- reserveIdent name- funCG (head . buildType $ typ') mfId [] $+ funCG (buildType typ') mfId [] $ do outE <- flattenWithName' abt "out" putStat . CReturn . Just $ outE @@ -107,7 +107,6 @@ -- when measure, compile to a sampler mainFunction pconfig typ@(SMeasure _) abt = do mfId <- reserveIdent "measure"- mdataId <- reserveIdent "mdata" mainId <- reserveIdent "main" argVId <- reserveIdent "argv" argCId <- reserveIdent "argc"@@ -115,10 +114,10 @@ extDeclareTypes typ -- defined a measure function that returns mdata- funCG (head . buildType $ typ) mfId [] $+ funCG (buildType typ) mfId [] $ (putStat . CReturn . Just) =<< flattenWithName' abt "samp" - funCG CInt mainId mainArgs $+ funCG [CInt] mainId mainArgs $ do isManagedMem <- managedMem <$> get when isManagedMem (putExprStat gcInit) @@ -131,8 +130,8 @@ printCG pconfig typ (CCall (CVar mfId) []) (Just nSamples) putStat . CReturn . Just $ intE 0 -mainFunction pconfig typ@(SFun _ _) abt =- coalesceLambda abt $ \vars abt' ->+mainFunction pconfig (SFun _ _) abt =+ coalesceLambda abt $ \_ abt' -> do resId <- reserveIdent "result" mainId <- reserveIdent "main" argVId <- reserveIdent "argv"@@ -142,7 +141,7 @@ let (resE:funE:argCE:argVE:[]) = fmap CVar [resId,funId,argCId,argVId] typ' = typeOf abt' - funCG CInt mainId mainArgs $+ funCG [CInt] mainId mainArgs $ do isManagedMem <- managedMem <$> get when isManagedMem (putExprStat gcInit) declare typ' resId@@ -166,7 +165,7 @@ putStat $ opComment "Parse Args" argEs <- foldLambdaWithIndex 1 abt $ \i (Variable _ _ t) -> do argE <- localVar' t "arg"- parseCG t (index argVE (intE i)) argE+ _ <- parseCG t (index argVE (intE i)) argE return argE case typ' of@@ -185,9 +184,7 @@ :: ABT Term abt => Integer -> abt '[] a- -> ( forall (x :: Hakaru)- . Integer- -> CodeGen ())+ -> (Integer -> CodeGen ()) -> CodeGen () withLambdaDepth' n abt_ k = caseVarSyn abt_@@ -210,7 +207,7 @@ mainId <- reserveIdent "main" let resE = CVar resId - funCG CInt mainId [] $+ funCG [CInt] mainId [] $ do declare typ resId isManagedMem <- managedMem <$> get@@ -358,16 +355,25 @@ printCG pconfig (SArray typ) arg Nothing = do itE <- localVar' SNat "it" putString "[ "- mkSequential- forCG (itE .=. (intE 0))- (itE .<. (arraySize arg))- (CUnary CPostIncOp itE)- (putExprStat- $ printfE [ stringE $ printFormat pconfig typ " "- , index (arrayData arg) itE ])+ seqDo $+ forCG (itE .=. (intE 0))+ (itE .<. (arraySize arg))+ (CUnary CPostIncOp itE)+ (putExprStat+ $ printfE [ stringE $ printFormat pconfig typ " "+ , index (arrayData arg) itE ]) putString "]\n" where putString s = putExprStat $ printfE [stringE s] +-- bool and unit+printCG _ (SData (STyCon sym) _) arg Nothing =+ case ssymbolVal sym of+ "Unit" -> putExprStat $ printfE [stringE "()\n"]+ "Bool" -> ifCG (datumIndex arg .==. (intE 0))+ (putExprStat $ printfE [stringE "true\n"])+ (putExprStat $ printfE [stringE "false\n"])+ _ -> error $ show sym+ printCG pconfig SProb arg Nothing = putExprStat $ printfE [ stringE $ printFormat pconfig SProb "\n"@@ -380,6 +386,10 @@ [ stringE $ printFormat pconfig typ "\n" , arg ] +-- we should only have a number of samples if it a measure+printCG _ _ _ (Just _) = error "this should not happen"++ printFormat :: PrintConfig -> Sing (a :: Hakaru) -> (String -> String) printFormat _ SInt = \s -> "%d" ++ s printFormat _ SNat = \s -> "%d" ++ s@@ -420,7 +430,7 @@ let varMs = foldMap11 (\v -> [mkVarDecl v =<< createIdent' "param" v]) vars typ = typeOf abt' in do argDecls <- sequence varMs- funCG (head . buildType $ typ) name argDecls $+ funCG (buildType typ) name argDecls $ (putStat . CReturn . Just) =<< flattenWithName' abt' "out" -- do at top level
haskell/Language/Hakaru/Command.hs view
@@ -1,12 +1,14 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE CPP+ , DataKinds+ , OverloadedStrings+ , FlexibleContexts+ #-} module Language.Hakaru.Command where import Language.Hakaru.Syntax.ABT import qualified Language.Hakaru.Syntax.AST as T import Language.Hakaru.Parser.Import (expandImports)-import Language.Hakaru.Parser.Parser hiding (style)+import Language.Hakaru.Parser.Parser (parseHakaru, parseHakaruWithImports) import Language.Hakaru.Parser.SymbolResolve (resolveAST) import Language.Hakaru.Syntax.TypeCheck @@ -20,6 +22,7 @@ import System.IO (stderr) import System.Environment (getArgs) import Data.Monoid ((<>),mconcat)+import System.FilePath (takeDirectory) #if __GLASGOW_HASKELL__ < 710 import Control.Applicative (Applicative(..), (<$>))@@ -29,25 +32,52 @@ parseAndInfer :: Text.Text -> Either Text.Text (TypedAST (TrivialABT T.Term))-parseAndInfer x =+parseAndInfer x = parseAndInferWithMode x LaxMode++parseAndInferWithMode+ :: ABT T.Term abt+ => Text.Text+ -> TypeCheckMode+ -> Either Text.Text (TypedAST abt)+parseAndInferWithMode x mode = case parseHakaru x of Left err -> Left (Text.pack . show $ err) Right past -> let m = inferType (resolveAST past) in- runTCM m (splitLines x) LaxMode+ runTCM m (splitLines x) mode -parseAndInfer' :: Text.Text+-- The filepath from which the text came and the text itself. If the filepath is+-- Nothing, imports are searched for in the current directory.+data Source = Source { file :: Maybe FilePath, source :: Text.Text }++sourceInput :: Source -> Maybe (Vector Text.Text)+sourceInput = splitLines . source++noFileSource :: Text.Text -> Source+noFileSource = Source Nothing++fileSource :: FilePath -> Text.Text -> Source+fileSource = Source . Just++parseAndInfer' :: Source -> IO (Either Text.Text (TypedAST (TrivialABT T.Term)))-parseAndInfer' x =+parseAndInfer' s = parseAndInferWithMode' s LaxMode++parseAndInferWithMode'+ :: ABT T.Term abt+ => Source+ -> TypeCheckMode+ -> IO (Either Text.Text (TypedAST abt))+parseAndInferWithMode' (Source dir x) mode = case parseHakaruWithImports x of Left err -> return . Left $ Text.pack . show $ err Right past -> do- past' <- runExceptT (expandImports past)+ past' <- runExceptT (expandImports (fmap takeDirectory dir) past) case past' of Left err -> return . Left $ Text.pack . show $ err Right past'' -> do let m = inferType (resolveAST past'')- return (runTCM m (splitLines x) LaxMode)+ return (runTCM m (splitLines x) mode) parseAndInferWithDebug :: Bool@@ -75,6 +105,9 @@ readFromFile :: String -> IO Text.Text readFromFile "-" = U.getContents readFromFile x = U.readFile x++readFromFile' :: String -> IO Source+readFromFile' x = Source (if x=="-" then Nothing else Just x) <$> readFromFile x simpleCommand :: (Text.Text -> IO ()) -> Text.Text -> IO () simpleCommand k fnName =
haskell/Language/Hakaru/Disintegrate.hs view
@@ -85,10 +85,10 @@ ( lam_ -- * the Hakaru API , disintegrateWithVar- , disintegrate+ , disintegrate, disintegrateInCtx , densityWithVar- , density- , observe+ , density, densityInCtx+ , observe, observeInCtx , determine -- * Implementation details@@ -128,6 +128,7 @@ import Language.Hakaru.Syntax.Datum import Language.Hakaru.Syntax.DatumCase (DatumEvaluator, MatchResult(..), matchBranches) import Language.Hakaru.Syntax.ABT+import Language.Hakaru.Syntax.Transform (TransformCtx(..), minimalCtx) import Language.Hakaru.Evaluation.Types import Language.Hakaru.Evaluation.Lazy import Language.Hakaru.Evaluation.DisintegrationMonad@@ -170,13 +171,14 @@ -- this note should be deleted.] disintegrateWithVar :: (ABT Term abt)- => Text.Text+ => TransformCtx+ -> Text.Text -> Sing a -> abt '[] ('HMeasure (HPair a b)) -> [abt '[] (a ':-> 'HMeasure b)]-disintegrateWithVar hint typ m =+disintegrateWithVar ctx hint typ m = let x = Variable hint (nextFreeOrBind m) typ- in map (lam_ x) . flip runDis [Some2 m, Some2 (var x)] $ do+ in map (lam_ x) . flip (runDisInCtx ctx) [Some2 m, Some2 (var x)] $ do ab <- perform m #ifdef __TRACE_DISINTEGRATE__ ss <- getStatements@@ -203,16 +205,26 @@ -- | A variant of 'disintegrateWithVar' which automatically computes -- the type via 'typeOf'.-disintegrate+disintegrateInCtx :: (ABT Term abt)- => abt '[] ('HMeasure (HPair a b))+ => TransformCtx+ -> abt '[] ('HMeasure (HPair a b)) -> [abt '[] (a ':-> 'HMeasure b)]-disintegrate m =+disintegrateInCtx ctx m = disintegrateWithVar+ ctx Text.empty (fst . sUnPair . sUnMeasure $ typeOf m) -- TODO: change the exception thrown form 'typeOf' so that we know it comes from here m +-- | A variant of 'disintegrateInCtx' which takes the context to be the minimal+-- one. Calling this function is only really valid on top-level programs, or+-- subprograms in which the enclosing program doesn't bind any variables.+disintegrate+ :: (ABT Term abt)+ => abt '[] ('HMeasure (HPair a b))+ -> [abt '[] (a ':-> 'HMeasure b)]+disintegrate = disintegrateInCtx minimalCtx -- | Return the density function for a given measure. The first two -- arguments give the hint and type of the lambda-bound variable@@ -224,40 +236,55 @@ -- we should make it into a Haskell function instead. densityWithVar :: (ABT Term abt)- => Text.Text+ => TransformCtx+ -> Text.Text -> Sing a -> abt '[] ('HMeasure a) -> [abt '[] (a ':-> 'HProb)]-densityWithVar hint typ m =+densityWithVar ctx hint typ m = let x = Variable hint (nextFree m `max` nextBind m) typ- in (lam_ x . E.total) <$> observe m (var x)+ in (lam_ x . E.total) <$> observeInCtx ctx m (var x) -- | A variant of 'densityWithVar' which automatically computes the -- type via 'typeOf'.-density+densityInCtx :: (ABT Term abt)- => abt '[] ('HMeasure a)+ => TransformCtx+ -> abt '[] ('HMeasure a) -> [abt '[] (a ':-> 'HProb)]-density m =+densityInCtx ctx m = densityWithVar+ ctx Text.empty (sUnMeasure $ typeOf m) m +density+ :: (ABT Term abt)+ => abt '[] ('HMeasure a)+ -> [abt '[] (a ':-> 'HProb)]+density = densityInCtx minimalCtx -- | Constrain a measure such that it must return the observed -- value. In other words, the resulting measure returns the observed -- value with weight according to its density in the original -- measure, and gives all other values weight zero.+observeInCtx+ :: (ABT Term abt)+ => TransformCtx+ -> abt '[] ('HMeasure a)+ -> abt '[] a+ -> [abt '[] ('HMeasure a)]+observeInCtx ctx m x =+ runDisInCtx ctx (constrainOutcome x m >> return x) [Some2 m, Some2 x]+ observe :: (ABT Term abt) => abt '[] ('HMeasure a) -> abt '[] a -> [abt '[] ('HMeasure a)]-observe m x =- runDis (constrainOutcome x m >> return x) [Some2 m, Some2 x]-+observe = observeInCtx minimalCtx -- | Arbitrarily choose one of the possible alternatives. In the -- future, this function should be replaced by a better one that@@ -548,8 +575,11 @@ constrainValue (P.coerceTo_ c v0) e1 NaryOp_ o es -> constrainNaryOp v0 o es PrimOp_ o :$ es -> constrainPrimOp v0 o es- Expect :$ e1 :* e2 :* End -> error "TODO: constrainValue{Expect}" + Transform_ t :$ _ -> error $+ concat["constrainValue{", show t, "}"+ ,": cannot yet disintegrate transforms; expand them first"]+ Case_ e bs -> -- First we try going forward on the scrutinee, to make -- pretty resulting programs; but if that doesn't work@@ -797,7 +827,8 @@ -- what the old finally-tagless code seems to have been doing. -- But is that right, or should they really be @return ()@? go :: MeasureOp typs a -> SArgs abt args -> Dis abt ()- go Lebesgue = \End -> bot -- TODO: see note above+ go Lebesgue = \(e1 :* e2 :* End) ->+ constrainValue v0 (P.lebesgue' e1 e2) go Counting = \End -> bot -- TODO: see note above go Categorical = \(e1 :* End) -> constrainValue v0 (P.categorical e1)@@ -990,6 +1021,8 @@ go Asinh = \(e1 :* End) -> error_TODO "Asinh" go Acosh = \(e1 :* End) -> error_TODO "Acosh" go Atanh = \(e1 :* End) -> error_TODO "Atanh"+ go Choose = \(e1 :* e2 :* End) -> error_TODO "Choose"+ go Floor = \(e1 :* End) -> error_TODO "Floor" go RealPow = \(e1 :* e2 :* End) -> -- TODO: There's a discrepancy between @(**)@ and @pow_@ in -- the old code...@@ -1208,8 +1241,10 @@ -> Dis abt () constrainOutcomeMeasureOp v0 = go where- -- Per the paper- go Lebesgue = \End -> return ()+ go Lebesgue = \(lo :* hi :* End) -> do+ -- TODO: optimize the cases where lo is -∞ or hi is ∞+ v0' <- emitLet' v0+ pushGuard (lo P.<= v0' P.&& v0' P.<= hi) -- TODO: I think, based on Hakaru v0.2.0 go Counting = \End -> return ()
haskell/Language/Hakaru/Evaluation/DisintegrationMonad.hs view
@@ -31,7 +31,7 @@ -- * The disintegration monad -- ** List-based version getStatements, putStatements- , ListContext(..), Ans, Dis(..), runDis+ , ListContext(..), Ans, Dis(..), runDis, runDisInCtx -- ** TODO: IntMap-based version -- * Operators on the disintegration monad@@ -107,6 +107,7 @@ import Language.Hakaru.Syntax.Datum import Language.Hakaru.Syntax.DatumABT import Language.Hakaru.Syntax.TypeOf+import Language.Hakaru.Syntax.Transform (TransformCtx(..), minimalCtx) import Language.Hakaru.Syntax.ABT import qualified Language.Hakaru.Syntax.Prelude as P import Language.Hakaru.Evaluation.Types@@ -301,11 +302,13 @@ -- We use 'Some2' on the inputs because it doesn't matter what their -- type or locally-bound variables are, so we want to allow @f@ to -- contain terms with different indices.-runDis :: (ABT Term abt, F.Foldable f)- => Dis abt (abt '[] a)+runDisInCtx+ :: (ABT Term abt, F.Foldable f)+ => TransformCtx+ -> Dis abt (abt '[] a) -> f (Some2 abt) -> [abt '[] ('HMeasure a)]-runDis d es =+runDisInCtx ctx d es = m0 [] c0 (ListContext i0 []) emptyAssocs where (Dis m0) = d >>= residualizeLocs@@ -316,7 +319,14 @@ -- that redex by changing the type of 'residualizeListContext'... c0 (e,rho) ss _ = [residualizeListContext ss rho (syn(Dirac :$ e :* End))] - i0 = maxNextFree es+ i0 = maxNextFree es `max` nextFreeVar ctx++runDis+ :: (ABT Term abt, F.Foldable f)+ => Dis abt (abt '[] a)+ -> f (Some2 abt)+ -> [abt '[] ('HMeasure a)]+runDis = runDisInCtx minimalCtx {----------------------------------------------------------------------------------
haskell/Language/Hakaru/Evaluation/ExpectMonad.hs view
@@ -48,6 +48,7 @@ import Language.Hakaru.Syntax.ABT (ABT(..), caseVarSyn, subst, maxNextFreeOrBind) import Language.Hakaru.Syntax.Variable (memberVarSet) import Language.Hakaru.Syntax.AST hiding (Expect)+import Language.Hakaru.Syntax.Transform (TransformCtx(..)) import Language.Hakaru.Evaluation.Types import Language.Hakaru.Evaluation.Lazy (evaluate) import Language.Hakaru.Evaluation.PEvalMonad (ListContext(..))@@ -120,13 +121,14 @@ :: forall abt f a . (ABT Term abt, F.Foldable f) => Expect abt (abt '[] a)+ -> TransformCtx -> abt '[a] 'HProb -> f (Some2 abt) -> abt '[] 'HProb-runExpect (Expect m) f es =+runExpect (Expect m) ctx f es = m c0 h0 where- i0 = nextFreeOrBind f `max` maxNextFreeOrBind es+ i0 = maximum [nextFreeOrBind f, maxNextFreeOrBind es, nextFreeVar ctx] h0 = ListContext i0 [] c0 e = residualizeExpectListContext $
haskell/Language/Hakaru/Evaluation/Lazy.hs view
@@ -59,7 +59,7 @@ import Language.Hakaru.Syntax.TypeOf import Language.Hakaru.Syntax.AST import Language.Hakaru.Syntax.Datum-import Language.Hakaru.Syntax.DatumCase (DatumEvaluator, MatchResult(..), matchBranches, MatchState(..), matchTopPattern)+import Language.Hakaru.Syntax.DatumCase (DatumEvaluator, MatchState(..), matchTopPattern) import Language.Hakaru.Syntax.ABT import Language.Hakaru.Evaluation.Types import qualified Language.Hakaru.Syntax.Prelude as P@@ -121,7 +121,7 @@ -- We don't bother evaluating these, even though we could... Integrate :$ e1 :* e2 :* e3 :* End -> return . Head_ $ WIntegrate e1 e2 e3- Summate h1 h2 :$ e1 :* e2 :* e3 :* End ->+ Summate _ _ :$ _ :* _ :* _ :* End -> return . Neutral $ syn t --return . Head_ $ WSummate e1 e2 e3 @@ -154,17 +154,12 @@ ArrayOp_ o :$ es -> evaluateArrayOp evaluate_ o es PrimOp_ o :$ es -> evaluatePrimOp evaluate_ o es - -- BUG: avoid the chance of looping in case 'E.expect' residualizes!- -- TODO: use 'evaluate' in 'E.expect' for the evaluation of @e1@- Expect :$ e1 :* e2 :* End ->- error "TODO: evaluate{Expect}: unclear how to handle this without cyclic dependencies"- {-- -- BUG: can't call E.expect because of cyclic dependency- evaluate_ . E.expect e1 $ \e3 ->- syn (Let_ :$ e3 :* e2 :* End)- -}+ Transform_ tt :$ _ -> error $+ concat ["TODO: evaluate{", show tt, "}"+ ,": cannot evaluate transforms; expand them first"] Case_ e bs -> evaluateCase_ e bs+ -- Bucket_ _ _ _ _ -> error "What oh what to do with a Bucket here?" _ :$ _ -> error "evaluate: the impossible happened" @@ -288,8 +283,8 @@ nor x y = not (x || y) -- BUG: no Floating instance for LogFloat (nor NonNegativeRational), so can't actually use this...-natRoot :: (Floating a) => a -> Nat -> a-natRoot x y = x ** recip (fromIntegral (fromNat y))+-- natRoot :: (Floating a) => a -> Nat -> a+-- natRoot x y = x ** recip (fromIntegral (fromNat y)) ----------------------------------------------------------------@@ -443,8 +438,9 @@ Head_ (WArrayLiteral es) -> return . Head_ . WLiteral . primCoerceFrom (Signed HRing_Int) . LInt . toInteger $ length es+ Head_ _ -> error "Got something odd when evaluating an array" - go (Reduce _) = \(e1 :* e2 :* e3 :* End) ->+ go (Reduce _) = \(_ :* _ :* _ :* End) -> error "TODO: evaluateArrayOp{Reduce}" ----------------------------------------------------------------@@ -546,10 +542,12 @@ go Asinh (e1 :* End) = neu1 P.asinh e1 go Acosh (e1 :* End) = neu1 P.acosh e1 go Atanh (e1 :* End) = neu1 P.atanh e1+ go Floor (e1 :* End) = neu1 P.floor e1 -- TODO: deal with how we have better types for these three ops than Haskell does... -- go RealPow (e1 :* e2 :* End) = rr2 (**) (P.**) e1 e2 go RealPow (e1 :* e2 :* End) = neu2 (P.**) e1 e2+ go Choose (e1 :* e2 :* End) = neu2 (P.choose) e1 e2 -- HACK: these aren't actually neutral! -- BUG: we should try to cancel out @(exp . log)@ and @(log . exp)@@@ -612,7 +610,7 @@ HEq_Int -> rr2 (==) (P.==) HEq_Prob -> rr2 (==) (P.==) HEq_Real -> rr2 (==) (P.==)- HEq_Array aEq -> error "TODO: rrEqual{HEq_Array}"+ HEq_Array _ -> error "TODO: rrEqual{HEq_Array}" HEq_Bool -> rr2 (==) (P.==) HEq_Unit -> rr2 (==) (P.==) HEq_Pair aEq bEq ->@@ -645,7 +643,7 @@ | reify va -> wb | otherwise -> Head_ $ WDatum dFalse - HEq_Either aEq bEq -> error "TODO: rrEqual{HEq_Either}"+ HEq_Either _ _ -> error "TODO: rrEqual{HEq_Either}" rrLess :: forall b. HOrd b -> abt '[] b -> abt '[] b -> m (Whnf abt HBool)@@ -655,10 +653,10 @@ HOrd_Int -> rr2 (<) (P.<) HOrd_Prob -> rr2 (<) (P.<) HOrd_Real -> rr2 (<) (P.<)- HOrd_Array aOrd -> error "TODO: rrLess{HOrd_Array}"+ HOrd_Array _ -> error "TODO: rrLess{HOrd_Array}" HOrd_Bool -> rr2 (<) (P.<) HOrd_Unit -> rr2 (<) (P.<)- HOrd_Pair aOrd bOrd ->+ HOrd_Pair _ _ -> \e1 e2 -> do w1 <- evaluate_ e1 w2 <- evaluate_ e2@@ -672,11 +670,11 @@ return . Neutral $ P.primOp2_ (Less theOrd) (fromHead v1) e2' Head_ v2 -> do- let (v1a, v1b) = reifyPair v1- let (v2a, v2b) = reifyPair v2+ let (_, _) = reifyPair v1+ let (_, _) = reifyPair v2 error "TODO: rrLess{HOrd_Pair}" -- BUG: The obvious recursion won't work because we need to know when the first components are equal before recursing (to implement lexicographic ordering). We really need a ternary comparison operator like 'compare'.- HOrd_Either aOrd bOrd -> error "TODO: rrLess{HOrd_Either}"+ HOrd_Either _ _ -> error "TODO: rrLess{HOrd_Either}" ----------------------------------------------------------------
haskell/Language/Hakaru/Evaluation/Types.hs view
@@ -394,7 +394,6 @@ CoerceTo_ c' :$ es' -> case es' of e' :* End -> Just $ P.coerceTo_ (c . c') e'- _ -> error "coerceTo@Whnf: the impossible happened" _ -> Nothing Head_ v -> case v of@@ -415,7 +414,6 @@ UnsafeFrom_ c' :$ es' -> case es' of e' :* End -> Just $ P.unsafeFrom_ (c' . c) e'- _ -> error "unsafeFrom@Whnf: the impossible happened" _ -> Nothing Head_ v -> case v of@@ -874,7 +872,7 @@ substVar :: Variable a -> abt '[] a -> (forall b'. Variable b' -> m (abt '[] b'))- substVar x e = return . var+ substVar _ _ = return . var extFreeVars :: abt xs a -> m (VarSet (KindOf a))@@ -930,7 +928,7 @@ -- can return for them because the variables are -- untouchable\/abstract. SStuff1 _ _ _ -> Just . return . Neutral $ var x- SGuard ys pat scrutinee i -> Just . return . Neutral $ var x+ SGuard _ _ _ _ -> Just . return . Neutral $ var x -- | A simple 'CaseEvaluator' which uses the 'DatumEvaluator' to
haskell/Language/Hakaru/Expect.hs view
@@ -7,6 +7,7 @@ , NoImplicitPrelude , ScopedTypeVariables , FlexibleContexts+ , ViewPatterns #-} {-# OPTIONS_GHC -Wall -fwarn-tabs #-}@@ -25,10 +26,10 @@ module Language.Hakaru.Expect ( normalize , total- , expect+ , expect, expectInCtx, determineExpect ) where -import Prelude (($), (.), error, reverse)+import Prelude (($), (.), error, reverse, Maybe(..)) import qualified Data.Text as Text import Data.Functor ((<$>)) import qualified Data.Foldable as F@@ -43,6 +44,7 @@ import Language.Hakaru.Syntax.ABT import Language.Hakaru.Syntax.Datum import Language.Hakaru.Syntax.DatumABT+import Language.Hakaru.Syntax.Transform (TransformCtx(..), minimalCtx) import Language.Hakaru.Syntax.AST hiding (Expect) import qualified Language.Hakaru.Syntax.AST as AST import Language.Hakaru.Syntax.TypeOf (typeOf)@@ -88,9 +90,27 @@ => abt '[] ('HMeasure a) -> abt '[a] 'HProb -> abt '[] 'HProb-expect e f = runExpect (expectTerm e) f [Some2 e, Some2 f]+expect = expectInCtx minimalCtx +expectInCtx+ :: (ABT Term abt)+ => TransformCtx+ -> abt '[] ('HMeasure a)+ -> abt '[a] 'HProb+ -> abt '[] 'HProb+expectInCtx ctx e f = runExpect (expectTerm e) ctx f [Some2 e, Some2 f] +-- | A helper which converts residualized `expect' to a `Nothing' instead.+determineExpect+ :: (ABT Term abt)+ => abt '[] 'HProb+ -> Maybe (abt '[] 'HProb)+determineExpect e =+ case e of+ (viewABT -> Syn (AST.Transform_ AST.Expect :$ _)) -> Nothing+ r -> Just r++ residualizeExpect :: (ABT Term abt) => abt '[] ('HMeasure a)@@ -99,7 +119,7 @@ -- BUG: is this what we really mean? or do we actually mean the old 'emit' version? x <- freshVar Text.empty (sUnMeasure $ typeOf e) unsafePush (SStuff1 (Location x) (\c ->- syn (AST.Expect :$ e :* bind x c :* End)) [])+ syn (AST.Transform_ AST.Expect :$ e :* bind x c :* End)) []) return $ var x {- residualizeExpect e = do@@ -303,8 +323,10 @@ => MeasureOp typs a -> SArgs abt args -> Expect abt (abt '[] a)-expectMeasureOp Lebesgue = \End ->- var <$> pushIntegrate P.negativeInfinity P.infinity+expectMeasureOp Lebesgue = \(lo :* hi :* End) -> do + lo' <- var <$> pushLet lo+ hi' <- var <$> pushLet hi+ var <$> pushIntegrate lo' hi' expectMeasureOp Counting = \End -> var <$> pushSummate P.negativeInfinity P.infinity expectMeasureOp Categorical = \(ps :* End) -> do
haskell/Language/Hakaru/Inference.hs view
@@ -2,6 +2,10 @@ , TypeOperators , NoImplicitPrelude , FlexibleContexts+ , GADTs+ , TypeFamilies+ , FlexibleInstances+ , ViewPatterns #-} {-# OPTIONS_GHC -Wall -fwarn-tabs #-}@@ -20,8 +24,8 @@ ---------------------------------------------------------------- module Language.Hakaru.Inference ( priorAsProposal- , mh- , mcmc+ , mh, mh'+ , mcmc, mcmc' , gibbsProposal , slice , sliceX@@ -33,17 +37,25 @@ ) where import Prelude (($), (.), error, Maybe(..), return)+import qualified Prelude as P import Language.Hakaru.Types.DataKind import Language.Hakaru.Types.Sing import Language.Hakaru.Syntax.AST (Term) import Language.Hakaru.Syntax.ABT (ABT, binder) import Language.Hakaru.Syntax.Prelude+import Language.Hakaru.Syntax.Transform (TransformCtx(..), minimalCtx) import Language.Hakaru.Syntax.TypeOf import Language.Hakaru.Expect (expect, normalize)-import Language.Hakaru.Disintegrate (determine, density, disintegrate)+import Language.Hakaru.Disintegrate (determine+ ,density, densityInCtx+ ,disintegrate, disintegrateInCtx)+import Language.Hakaru.Syntax.IClasses (TypeEq(..), JmEq1(..)) import qualified Data.Text as Text+import Control.Monad.Except (MonadError(..)) +import qualified Control.Applicative as P+ ---------------------------------------------------------------- ---------------------------------------------------------------- priorAsProposal@@ -68,34 +80,48 @@ -- -- TODO: the @a@ type should be pure (aka @a ~ Expect' a@ in the old parlance). -- BUG: get rid of the SingI requirements due to using 'lam'-mh :: (ABT Term abt)- => abt '[] (a ':-> 'HMeasure a)- -> abt '[] ('HMeasure a)- -> abt '[] (a ':-> 'HMeasure (HPair a 'HProb))-mh proposal target =- case determine $ density target of- Nothing -> error "mh: couldn't get density"- Just theDensity ->- let_ theDensity $ \mu ->+mh' :: (ABT Term abt)+ => TransformCtx+ -> abt '[] (a ':-> 'HMeasure a)+ -> abt '[] ('HMeasure a)+ -> Maybe (abt '[] (a ':-> 'HMeasure (HPair a 'HProb)))+mh' ctx proposal target =+ let_ P.<$> (determine $ densityInCtx ctx target) P.<*> P.pure (\mu -> lam' $ \old -> app proposal old >>= \new ->- dirac $ pair' new (mu `app` {-pair-} new {-old-} / mu `app` {-pair-} old {-new-})+ dirac $ pair' new (mu `app` {-pair-} new {-old-} / mu `app` {-pair-} old {-new-})) where lam' f = lamWithVar Text.empty (sUnMeasure $ typeOf target) f pair' = pair_ (sUnMeasure $ typeOf target) SProb +mh :: (ABT Term abt)+ => abt '[] (a ':-> 'HMeasure a)+ -> abt '[] ('HMeasure a)+ -> abt '[] (a ':-> 'HMeasure (HPair a 'HProb))+mh proposal target =+ P.maybe (error "mh: couldn't compute density") P.id $+ mh' minimalCtx proposal target+ -- BUG: get rid of the SingI requirements due to using 'lam' in 'mh'-mcmc :: (ABT Term abt)- => abt '[] (a ':-> 'HMeasure a)- -> abt '[] ('HMeasure a)- -> abt '[] (a ':-> 'HMeasure a)-mcmc proposal target =- let_ (mh proposal target) $ \f ->+mcmc' :: (ABT Term abt)+ => TransformCtx+ -> abt '[] (a ':-> 'HMeasure a)+ -> abt '[] ('HMeasure a)+ -> Maybe (abt '[] (a ':-> 'HMeasure a))+mcmc' ctx proposal target =+ let_ P.<$> mh' ctx proposal target P.<*> P.pure (\f -> lamWithVar Text.empty (sUnMeasure $ typeOf target) $ \old -> app f old >>= \new_ratio -> new_ratio `unpair` \new ratio -> bern (min (prob_ 1) ratio) >>= \accept ->- dirac (if_ accept new old)+ dirac (if_ accept new old)) +mcmc :: (ABT Term abt)+ => abt '[] (a ':-> 'HMeasure a)+ -> abt '[] ('HMeasure a)+ -> abt '[] (a ':-> 'HMeasure a)+mcmc proposal target =+ P.maybe (error "mcmc: couldn't compute density") P.id $+ mcmc' minimalCtx proposal target gibbsProposal :: (ABT Term abt, SingI a, SingI b)
haskell/Language/Hakaru/Maple.hs view
@@ -1,4 +1,5 @@-{-# LANGUAGE FlexibleInstances+{-# LANGUAGE CPP+ , FlexibleInstances , FlexibleContexts , DeriveDataTypeable , DataKinds@@ -6,7 +7,11 @@ , RecordWildCards , ViewPatterns , LambdaCase- , DeriveFunctor, DeriveFoldable, DeriveTraversable + , KindSignatures+ , TypeOperators+ , GADTs+ , RankNTypes+ , DeriveFunctor, DeriveFoldable, DeriveTraversable #-} {-# OPTIONS_GHC -Wall -fwarn-tabs #-}@@ -17,51 +22,62 @@ -- Stability : experimental -- Portability : GHC-only ----- Take strings from Maple and interpret them in Haskell (Hakaru), --- in a type-safe way. +-- Take strings from Maple and interpret them in Haskell (Hakaru),+-- in a type-safe way. -----------------------------------------------------------------module Language.Hakaru.Maple +module Language.Hakaru.Maple ( MapleException(..) , MapleOptions(..)+ , MapleCommand(MapleCommand) , defaultMapleOptions , sendToMaple, sendToMaple' , maple- ) where - -import Control.Exception+ ) where++import Control.Exception (Exception, throw) import Control.Monad (when)+import Data.Typeable (Typeable) import qualified Language.Hakaru.Pretty.Maple as Maple import Language.Hakaru.Parser.Maple import Language.Hakaru.Parser.AST (Name)-import qualified Language.Hakaru.Parser.SymbolResolve as SR (resolveAST', fromVarSet)+import Language.Hakaru.Pretty.Concrete (prettyType)+import qualified Language.Hakaru.Parser.SymbolResolve as SR+ (resolveAST', fromVarSet) import Language.Hakaru.Types.Sing+import Language.Hakaru.Types.DataKind import Language.Hakaru.Syntax.ABT import Language.Hakaru.Syntax.AST import Language.Hakaru.Syntax.TypeCheck import Language.Hakaru.Syntax.TypeOf-import Language.Hakaru.Syntax.Command +import Language.Hakaru.Syntax.IClasses import Language.Hakaru.Evaluation.ConstantPropagation -import Data.Typeable (Typeable)- import System.MapleSSH (maple) import System.IO import Data.Text (pack)-import qualified Data.Map as M -import Data.List (intercalate) +import qualified Data.Map as M+import Data.List (isInfixOf, intercalate)+import Data.Char (toLower)+import Data.Function (on) import Data.Foldable (Foldable) import Data.Traversable (Traversable) +#if __GLASGOW_HASKELL__ < 710+import Data.Monoid (mempty)+#endif+ -----------------------------------------------------------------data MapleException +data MapleException = MapleInterpreterException String String | MapleInputTypeMismatch String String | MapleUnknownCommand String+ | MapleAmbiguousCommand String [String]+ | MultipleErrors [MapleException] deriving Typeable instance Exception MapleException@@ -77,12 +93,19 @@ concat["Maple command ", command, " does not take input of type ", ty] show (MapleUnknownCommand command) = concat["Maple command ", command, " does not exist"] + show (MapleAmbiguousCommand str cmds) =+ concat [ "Ambiguous command\n"+ , str, " could refer to any of\n"+ , intercalate "," cmds ]+ show (MultipleErrors es) =+ concat $ "Multiple errors" : map (("\n\n" ++) . show) es data MapleOptions nm = MapleOptions { command :: nm , debug :: Bool , timelimit :: Int , extraOpts :: M.Map String String + , context :: TransformCtx } deriving (Functor, Foldable, Traversable) defaultMapleOptions :: MapleOptions () @@ -90,32 +113,113 @@ { command = () , debug = False , timelimit = 90- , extraOpts = M.empty }+ , extraOpts = M.empty+ , context = mempty } +--------------------------------------------------------------------------------++-- | Maple commands operate on closed terms and take a single argument, and can+-- be applied under functions.+data MapleCommand (i :: Hakaru) (o :: Hakaru) where+ MapleCommand :: !(Transform '[ '( '[], i ) ] o) -> MapleCommand i o+ UnderFun :: !(MapleCommand i o) -> MapleCommand (x ':-> i) (x ':-> o)++typeOfMapleCommand :: MapleCommand i o -> Sing i -> Sing o+typeOfMapleCommand (MapleCommand t) i =+ typeOfTransform t (Pw (Lift1 ()) i :* End)+typeOfMapleCommand (UnderFun c) (SFun x i) =+ SFun x (typeOfMapleCommand c i)++newtype CommandMatcher+ = CommandMatcher (forall i . Sing i+ -> Either MapleException (Some1 (MapleCommand i)))++infixl 3 <-|>+(<-|>) :: Either MapleException x+ -> Either MapleException x+ -> Either MapleException x+(<-|>) (Left x) (Left y) =+ Left $ MultipleErrors (unnest x ++ unnest y) where+ unnest (MultipleErrors e) = concatMap unnest e+ unnest e = [e]+(<-|>) Left{} x = x+(<-|>) x@Right{} _ = x++matchUnderFun :: CommandMatcher -> CommandMatcher+matchUnderFun (CommandMatcher k) = CommandMatcher go where+ go :: Sing i -> Either MapleException (Some1 (MapleCommand i))+ go ty@(SFun _ i) =+ fmap (\(Some1 c) -> Some1 (UnderFun c)) (go i) <-|>+ k ty+ go ty =+ k ty <-|>+ Left (MapleInputTypeMismatch "x -> y" (show $ prettyType 0 ty))++mapleCommands+ :: [ (String, CommandMatcher) ]+mapleCommands =+ [ ("Simplify"+ , CommandMatcher $ \_ -> return $ Some1 $ MapleCommand Simplify)+ , ("Reparam"+ , CommandMatcher $ \_ -> return $ Some1 $ MapleCommand Reparam)+ , ("Summarize"+ , CommandMatcher $ \_ -> return $ Some1 $ MapleCommand Summarize)+ , ("Disintegrate"+ , matchUnderFun $ CommandMatcher $ \i ->+ case i of+ SMeasure (SData (STyApp (STyApp+ (STyCon (jmEq1 sSymbol_Pair -> Just Refl)) _) _) _) ->+ return $ Some1 $ MapleCommand $ Disint InMaple+ _ -> Left $+ MapleInputTypeMismatch "measure (pair (a,b))"+ (show $ prettyType 0 i))+ ]++matchCommandName :: String -> Sing i+ -> Either MapleException (Some1 (MapleCommand i))+matchCommandName s i =+ case filter ((isInfixOf `on` map toLower) s . fst) mapleCommands of+ [(_,CommandMatcher m)]+ -> m i+ [] -> Left $ MapleUnknownCommand s+ cs -> Left $ MapleAmbiguousCommand s (map fst cs)++nameOfMapleCommand :: MapleCommand i o -> Either MapleException String+nameOfMapleCommand (MapleCommand t) = nm t where+ nm :: Transform xs x -> Either MapleException String+ nm Simplify = Right "Simplify"+ nm (Disint InMaple) = Right "Disintegrate"+ nm Summarize = Right "Summarize"+ nm Reparam = Right "Reparam"+ nm tt = Left $ MapleUnknownCommand (show tt)+nameOfMapleCommand (UnderFun c) = nameOfMapleCommand c++--------------------------------------------------------------------------------+ sendToMaple' :: ABT Term (abt Term) => MapleOptions String -> TypedAST (abt Term) -> IO (TypedAST (abt Term))-sendToMaple' MapleOptions{..} (TypedAST ty expr) = - commandFromName command ty $ \case - Left True -> throw $ MapleInputTypeMismatch command (show ty) - Left False -> throw $ MapleUnknownCommand command - Right (c, ty_o) -> fmap (TypedAST ty_o) (sendToMaple MapleOptions{command=c,..} expr)+sendToMaple' o@MapleOptions{..} (TypedAST typ term) = do+ Some1 cmdT <- either throw return $ matchCommandName command typ+ res <- sendToMaple o{command=cmdT} term+ return $ TypedAST (typeOf res) res -sendToMaple +sendToMaple :: (ABT Term abt)- => MapleOptions (CommandType c i o) - -> abt '[] i + => MapleOptions (MapleCommand i o)+ -> abt '[] i -> IO (abt '[] o)-sendToMaple MapleOptions{..} e = do +sendToMaple MapleOptions{..} e = do+ nm <- either throw return $ nameOfMapleCommand command let typ_in = typeOf e- typ_out = commandIsType command typ_in + typ_out = typeOfMapleCommand command typ_in optStr (k,v) = concat["_",k,"=",v] optsStr = intercalate "," $ map optStr $ M.assocs $ - M.insert "command" (ssymbolVal(nameOfCommand command)) extraOpts + M.insert "command" nm extraOpts toMaple_ = "use Hakaru, NewSLO in timelimit(" ++ show timelimit ++ ", RoundTrip(" ++ Maple.pretty e ++ ", " ++ Maple.mapleType typ_in (", "@@ -131,10 +235,11 @@ (return . constantPropagation) $ do past <- leftShow $ parseMaple (pack fromMaple) let m = checkType typ_out- (SR.resolveAST' (getNames e) (maple2AST past))+ (SR.resolveAST' (max (nextFreeOrBind e) (nextFreeVar context))+ (getNames e) (maple2AST past)) leftShow $ unTCM m (freeVars e) Nothing UnsafeMode _ -> throw (MapleInterpreterException toMaple_ fromMaple)- + leftShow :: forall b c. Show b => Either b c -> Either String c leftShow (Left err) = Left (show err) leftShow (Right x) = Right x
haskell/Language/Hakaru/Parser/AST.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE CPP+ {-# LANGUAGE CPP , GADTs , DataKinds , PolyKinds@@ -7,6 +7,11 @@ , TypeFamilies , TypeOperators , OverloadedStrings+ , DeriveDataTypeable+ , ScopedTypeVariables+ , RankNTypes+ , FlexibleContexts+ , LambdaCase #-} {-# OPTIONS_GHC -Wall -fwarn-tabs #-}@@ -28,88 +33,113 @@ import Language.Hakaru.Syntax.ABT hiding (Var, Bind) import Language.Hakaru.Syntax.AST (Literal(..), MeasureOp(..), LCs(), UnLCs ())+import qualified Language.Hakaru.Syntax.AST as T import Language.Hakaru.Syntax.IClasses #if __GLASGOW_HASKELL__ < 710 import Data.Monoid (Monoid(..)) #endif -import Data.Text-import Text.Printf+import qualified Data.Text as T import Text.Parsec (SourcePos) import Text.Parsec.Pos+import Data.Generics hiding ((:~:)(..)) -- N.B., because we're not using the ABT's trick for implementing a HOAS API, we can make the identifier strict.-data Name = Name {-# UNPACK #-}!N.Nat {-# UNPACK #-}!Text- deriving (Read, Show, Eq, Ord)+data Name = Name {-# UNPACK #-}!N.Nat {-# UNPACK #-}!T.Text+ deriving (Read, Show, Eq, Ord, Data, Typeable) nameID :: Name -> N.Nat nameID (Name i _) = i -hintID :: Name -> Text+hintID :: Name -> T.Text hintID (Name _ t) = t ---------------------------------------------------------------- ---------------------------------------------------------------- -type Name' = Text+type Name' = T.Text data Branch' a = Branch' (Pattern' Name') (AST' a) | Branch'' (Pattern' Name) (AST' a)- deriving (Eq, Show)+ deriving (Eq, Show, Data, Typeable) data Pattern' a = PVar' a | PWild' | PData' (PDatum a)- deriving (Eq, Show)+ deriving (Eq, Show, Data, Typeable) data PDatum a = DV Name' [Pattern' a]- deriving (Eq, Show)+ deriving (Eq, Show, Data, Typeable) -- Meta stores start and end position for AST in source code data SourceSpan = SourceSpan !SourcePos !SourcePos- deriving (Eq, Show)--numberLine :: Text -> Int -> Text-numberLine s n = append (pack (printf "%5d| " n)) s+ deriving (Eq, Show, Data, Typeable) -printSourceSpan :: SourceSpan -> V.Vector Text -> Text+printSourceSpan :: SourceSpan -> V.Vector T.Text -> T.Text printSourceSpan (SourceSpan start stop) input- | sourceLine start == sourceLine stop =- unlines [ numberLine endLine (sourceLine stop)- , append " " textSpan- ]- | otherwise =- unlines $ flip fmap [sourceLine start .. sourceLine stop] $ \i ->- numberLine (input V.! (i - 1)) i- where endLine = input V.! (sourceLine stop - 1)- spanLen = sourceColumn stop - sourceColumn start- textSpan =- append (replicate (sourceColumn start - 1) " ")- (replicate spanLen "^")+ = T.unlines (concatMap line [startLine..stopLine])+ where+ line :: Int -> [T.Text]+ line i | (sourceLine start, sourceColumn start) <= (i, 1) &&+ (i, eol) <= (sourceLine stop, sourceColumn stop)+ = [T.empty | i == startLine] +++ [quote '>'] +++ [T.empty | i == stopLine]+ | i == stopLine+ = [T.empty | i == startLine] +++ [quote ' ',+ marking (if i == sourceLine start then sourceColumn start else 1)+ (if i == sourceLine stop then sourceColumn stop else eol)+ '^']+ | i == sourceLine start+ = [marking (sourceColumn start) eol '.',+ quote ' ']+ | otherwise+ = [quote ' ']+ where numbering = T.pack (show i)+ lining = input V.! (i-1)+ eol = T.length lining + 1+ quote c = spacing (digits - T.length numbering)+ `T.append` numbering+ `T.append` T.singleton '|'+ `T.append` T.singleton c+ `T.append` lining+ spacing k = T.replicate k (T.singleton ' ')+ marking l r c = spacing (digits + 1 + l)+ `T.append` T.replicate (max 1 (r - l)) (T.singleton c)+ startLine = max 1+ $ sourceLine start+ stopLine = max startLine+ $ min (V.length input)+ $ (if sourceColumn stop == 1 then pred else id)+ $ sourceLine stop+ digits = loop stopLine 1+ where loop i res | i < 10 = res+ | otherwise = (loop $! div i 10) $! (res + 1) data Literal' = Nat Integer | Int Integer | Prob Rational | Real Rational- deriving (Eq, Show)+ deriving (Eq, Show, Data, Typeable) data NaryOp = And | Or | Xor | Iff | Min | Max | Sum | Prod- deriving (Eq, Show)+ deriving (Eq, Show, Data, Typeable) -data ArrayOp = Index_ | Size | Reduce+data ArrayOp = Index_ | Size | Reduce deriving (Data, Typeable) data TypeAST' = TypeVar Name' | TypeApp Name' [TypeAST'] | TypeFun TypeAST' TypeAST'- deriving (Eq, Show)+ deriving (Eq, Show, Data, Typeable) data Reducer' a = R_Fanout (Reducer' a) (Reducer' a)@@ -117,8 +147,30 @@ | R_Split (AST' a) (Reducer' a) (Reducer' a) | R_Nop | R_Add (AST' a)- deriving (Eq, Show)+ deriving (Eq, Show, Data, Typeable) +data Transform'+ = Observe+ | MH+ | MCMC+ | Disint T.TransformImpl+ | Summarize+ | Simplify+ | Reparam+ | Expect+ deriving (Eq, Show, Data, Typeable)++trFromTyped :: T.Transform as x -> Transform'+trFromTyped = \case+ T.Observe -> Observe+ T.MH -> MH+ T.MCMC -> MCMC+ T.Disint k -> Disint k+ T.Summarize -> Summarize+ T.Simplify -> Simplify+ T.Reparam -> Reparam+ T.Expect -> Expect+ data AST' a = Var a | Lam a TypeAST' (AST' a)@@ -130,13 +182,11 @@ | ULiteral Literal' | NaryOp NaryOp [AST' a] | Unit- | Empty | Pair (AST' a) (AST' a) | Array a (AST' a) (AST' a) | ArrayLiteral [AST' a] | Index (AST' a) (AST' a) | Case (AST' a) [(Branch' a)] -- match- | Dirac (AST' a) | Bind a (AST' a) (AST' a) | Plate a (AST' a) (AST' a) | Chain a (AST' a) (AST' a) (AST' a)@@ -144,13 +194,26 @@ | Summate a (AST' a) (AST' a) (AST' a) | Product a (AST' a) (AST' a) (AST' a) | Bucket a (AST' a) (AST' a) (Reducer' a)- | Expect a (AST' a) (AST' a)- | Observe (AST' a) (AST' a)+ | Transform Transform' (SArgs' a) | Msum [AST' a] | Data a [a] [TypeAST'] (AST' a) | WithMeta (AST' a) SourceSpan- deriving (Show)+ deriving (Show, Data, Typeable) +newtype SArgs' a = SArgs' [ ([a], AST' a) ]+ deriving (Eq, Show, Data, Typeable)++-- For backwards compatibility+_Expect :: a -> AST' a -> AST' a -> AST' a+_Expect v a b = Transform Expect $ SArgs' $ [ ([], a), ([v], b) ]++withoutMeta :: AST' a -> AST' a+withoutMeta (WithMeta e _) = withoutMeta e+withoutMeta e = e++withoutMetaE :: forall a . Data a => AST' a -> AST' a+withoutMetaE = everywhere (mkT (withoutMeta :: AST' a -> AST' a))+ instance Eq a => Eq (AST' a) where (Var t) == (Var t') = t == t' (Lam n e1 e2) == (Lam n' e1' e2') = n == n' &&@@ -171,7 +234,6 @@ (NaryOp op args) == (NaryOp op' args') = op == op' && args == args' Unit == Unit = True- Empty == Empty = True (Pair e1 e2) == (Pair e1' e2') = e1 == e1' && e2 == e2' (Array e1 e2 e3) == (Array e1' e2' e3') = e1 == e1' &&@@ -182,7 +244,6 @@ e2 == e2' (Case e1 bs) == (Case e1' bs') = e1 == e1' && bs == bs'- (Dirac e1) == (Dirac e1') = e1 == e1' (Bind e1 e2 e3) == (Bind e1' e2' e3') = e1 == e1' && e2 == e2' && e3 == e3'@@ -209,11 +270,8 @@ b == b' && c == c' && d == d'- (Expect e1 e2 e3) == (Expect e1' e2' e3') = e1 == e1' &&- e2 == e2' &&- e3 == e3'- (Observe e1 e2) == (Observe e1' e2') = e1 == e1' &&- e2 == e2'+ (Transform t0 es0) == (Transform t1 es1) = t0 == t1 &&+ es0 == es1 (Msum es) == (Msum es') = es == es' (Data n ft ts e) == (Data n' ft' ts' e') = n == n' && ft == ft' &&@@ -244,12 +302,13 @@ | Asin | Acos | Atan | Sinh | Cosh | Tanh | Asinh | Acosh | Atanh- | RealPow | NatPow+ | RealPow | Choose | NatPow | Exp | Log | Infinity | GammaFunc | BetaFunc | Equal | Less | Negate | Recip | Abs | Signum | NatRoot | Erf+ | Floor deriving (Eq, Show) data SomeOp op where@@ -278,7 +337,7 @@ data Pattern = PWild | PVar Name- | PDatum Text PCode+ | PDatum T.Text PCode data PFun = PKonst Pattern@@ -306,7 +365,7 @@ = Inr (DCode abt) | Inl (DStruct abt) -data Datum abt = Datum Text (DCode abt)+data Datum abt = Datum T.Text (DCode abt) fmapDatum :: (f '[] 'U -> g '[] 'U)@@ -412,7 +471,6 @@ MeasureOp_ :: SomeOp MeasureOp -> [abt '[] 'U] -> Term abt 'U NaryOp_ :: NaryOp -> [abt '[] 'U] -> Term abt 'U Literal_ :: Some1 Literal -> Term abt 'U- Empty_ :: Term abt 'U Pair_ :: abt '[] 'U -> abt '[] 'U -> Term abt 'U Array_ :: abt '[] 'U -> abt '[ 'U ] 'U -> Term abt 'U ArrayLiteral_ :: [abt '[] 'U] -> Term abt 'U@@ -426,12 +484,27 @@ Summate_ :: abt '[] 'U -> abt '[] 'U -> abt '[ 'U ] 'U -> Term abt 'U Product_ :: abt '[] 'U -> abt '[] 'U -> abt '[ 'U ] 'U -> Term abt 'U Bucket_ :: abt '[] 'U -> abt '[] 'U -> Reducer xs abt 'U -> Term abt 'U- Expect_ :: abt '[] 'U -> abt '[ 'U ] 'U -> Term abt 'U- Observe_ :: abt '[] 'U -> abt '[] 'U -> Term abt 'U+ Transform_ :: T.Transform as x -> SArgs abt as -> Term abt 'U Superpose_ :: L.NonEmpty (abt '[] 'U, abt '[] 'U) -> Term abt 'U Reject_ :: Term abt 'U+ InjTyped :: (forall abt' . ABT T.Term abt'+ => abt' '[] x) -> Term abt 'U +infixr 5 :*+data SArgs (abt :: [Untyped] -> Untyped -> *) (as :: [([k], k)]) where+ End :: SArgs abt '[]+ (:*) :: !(List2 ToUntyped vars varsu, abt varsu 'U)+ -> !(SArgs abt args)+ -> SArgs abt ( '(vars, a) ': args) +data ToUntyped (x :: k) (y :: Untyped) where+ ToU :: ToUntyped x 'U++instance Functor21 SArgs where+ fmap21 f = \case+ End -> End+ (m, a) :* as -> (m, f a) :* fmap21 f as+ -- TODO: instance of Traversable21 for Term instance Functor21 Term where fmap21 f (Lam_ typ e1) = Lam_ typ (f e1)@@ -445,7 +518,6 @@ fmap21 f (MeasureOp_ op es) = MeasureOp_ op (fmap f es) fmap21 f (NaryOp_ op es) = NaryOp_ op (fmap f es) fmap21 _ (Literal_ v) = Literal_ v- fmap21 _ Empty_ = Empty_ fmap21 f (Pair_ e1 e2) = Pair_ (f e1) (f e2) fmap21 f (Array_ e1 e2) = Array_ (f e1) (f e2) fmap21 f (ArrayLiteral_ es) = ArrayLiteral_ (fmap f es)@@ -459,11 +531,16 @@ fmap21 f (Summate_ e1 e2 e3) = Summate_ (f e1) (f e2) (f e3) fmap21 f (Product_ e1 e2 e3) = Product_ (f e1) (f e2) (f e3) fmap21 f (Bucket_ e1 e2 e3) = Bucket_ (f e1) (f e2) (fmap21 f e3)- fmap21 f (Expect_ e1 e2) = Expect_ (f e1) (f e2)- fmap21 f (Observe_ e1 e2) = Observe_ (f e1) (f e2)+ fmap21 f (Transform_ t as) = Transform_ t (fmap21 f as) fmap21 f (Superpose_ es) = Superpose_ (L.map (f *** f) es) fmap21 _ Reject_ = Reject_+ fmap21 _ (InjTyped x) = InjTyped x +instance Foldable21 SArgs where+ foldMap21 f = \case+ End -> mempty+ (_, a) :* as -> f a `mappend` foldMap21 f as+ instance Foldable21 Term where foldMap21 f (Lam_ _ e1) = f e1 foldMap21 f (App_ e1 e2) = f e1 `mappend` f e2@@ -476,7 +553,6 @@ foldMap21 f (MeasureOp_ _ es) = F.foldMap f es foldMap21 f (NaryOp_ _ es) = F.foldMap f es foldMap21 _ (Literal_ _) = mempty- foldMap21 _ Empty_ = mempty foldMap21 f (Pair_ e1 e2) = f e1 `mappend` f e2 foldMap21 f (Array_ e1 e2) = f e1 `mappend` f e2 foldMap21 f (ArrayLiteral_ es) = F.foldMap f es@@ -490,10 +566,10 @@ foldMap21 f (Summate_ e1 e2 e3) = f e1 `mappend` f e2 `mappend` f e3 foldMap21 f (Product_ e1 e2 e3) = f e1 `mappend` f e2 `mappend` f e3 foldMap21 f (Bucket_ e1 e2 e3) = f e1 `mappend` f e2 `mappend` foldMap21 f e3- foldMap21 f (Expect_ e1 e2) = f e1 `mappend` f e2- foldMap21 f (Observe_ e1 e2) = f e1 `mappend` f e2+ foldMap21 f (Transform_ _ es) = foldMap21 f es foldMap21 f (Superpose_ es) = F.foldMap (\(e1,e2) -> f e1 `mappend` f e2) es foldMap21 _ Reject_ = mempty+ foldMap21 _ InjTyped{} = mempty type U_ABT = MetaABT SourceSpan Term type AST = U_ABT '[] 'U
haskell/Language/Hakaru/Parser/Import.hs view
@@ -1,15 +1,15 @@ {-# LANGUAGE CPP, OverloadedStrings #-} {-# OPTIONS_GHC -Wall -fwarn-tabs #-}-module Language.Hakaru.Parser.Import where+module Language.Hakaru.Parser.Import (expandImports) where import Language.Hakaru.Parser.AST-import Language.Hakaru.Parser.Parser+import Language.Hakaru.Parser.Parser (parseHakaruWithImports) import Control.Monad.Trans.Except import Control.Monad.IO.Class import qualified Data.Text as T import qualified Data.Text.IO as IO-import Text.Parsec hiding (Empty)+import Text.Parsec replaceBody :: AST' T.Text -> AST' T.Text -> AST' T.Text replaceBody e1 e2 =@@ -20,11 +20,13 @@ _ -> e2 expandImports- :: ASTWithImport' T.Text+ :: Maybe FilePath+ -> ASTWithImport' T.Text -> ExceptT ParseError IO (AST' T.Text)-expandImports (ASTWithImport' (Import i:is) ast) = do- file <- liftIO . IO.readFile . T.unpack $ T.append i ".hk"+expandImports dir (ASTWithImport' (Import i:is) ast) = do+ file <- liftIO . IO.readFile . T.unpack $+ T.concat $ maybe [] ((:["/"]) . T.pack) dir ++ [ i, ".hk" ] astIm <- ExceptT . return $ parseHakaruWithImports file- ast' <- expandImports astIm- expandImports (ASTWithImport' is (replaceBody ast' ast))-expandImports (ASTWithImport' [] ast) = return ast+ ast' <- expandImports dir astIm+ expandImports dir (ASTWithImport' is (replaceBody ast' ast))+expandImports _ (ASTWithImport' [] ast) = return ast
haskell/Language/Hakaru/Parser/Maple.hs view
@@ -239,7 +239,7 @@ lesseq :: Parser InertExpr lesseq = do- text "_Inert_LESSEQ"+ _ <- text "_Inert_LESSEQ" args <- arg expr return $ InertArgs Not_ [ InertArgs Less (reverse args)]@@ -317,9 +317,6 @@ [InertName "Datum", InertArgs ExpSeq [InertName h, d]]) = mapleDatum2AST h d -maple2AST (InertArgs Func [InertName "Lebesgue", _]) =- Var "lebesgue"- maple2AST (InertArgs Func [InertName "Counting", _]) = Var "counting" @@ -360,6 +357,8 @@ maple2AST (InertArgs Func [InertName "piecewise", InertArgs ExpSeq es]) = go es where+ go [] = error "Invalid 0-ary piecewise?"+ go [_] = error "Invalid 1-ary piecewise?" go [e1,e2] = If (maple2AST e1) (maple2AST e2) (ULiteral (Nat 0)) go [e1,e2,e3] = If (maple2AST e1) (maple2AST e2) (maple2AST e3) -- BUG! piecewise(a<b,2,a=b,1) doesn't mean piecewise(a<b,2,1) in Maple@@ -485,6 +484,13 @@ maple2AST (InertArgs Less es) = foldl App (Var "less") (map maple2AST es) +-- Special case to undo the "piecewise(x=true,...)" created by our Maple code+-- (in the Hakaru:-make_piece function), to avoid the error produced by Maple+-- "piecewise(x,...)". (This "=true" is also removed by NewSLO:-applyintegrand+-- if Maple ever substitutes something for x, but that may never happen.)+maple2AST (InertArgs Equal [e, InertName "true"]) = maple2AST e+maple2AST (InertArgs Equal [InertName "true", e]) = maple2AST e+ maple2AST (InertArgs Equal es) = foldl App (Var "equal") (map maple2AST es) @@ -546,6 +552,8 @@ [ InertName "Add" , InertArgs ExpSeq [e1]]) = R_Add (maple2AST e1) +maple2ReducerAST _ = error "TODO: maple2ReducerAST, so many cases..."+ mapleDatum2AST :: Text -> InertExpr -> AST' Text mapleDatum2AST h d = case (h, maple2DCode d) of ("pair", [x,y]) -> Pair x y@@ -651,6 +659,7 @@ [InertName "Branch", InertArgs ExpSeq [pat, e]]) = Branch' (maple2Pattern pat) (maple2AST e)+branch _ = error "Branch: got some ill-formed case statement back?" maple2Pattern :: InertExpr -> Pattern' Text
haskell/Language/Hakaru/Parser/Parser.hs view
@@ -1,6 +1,6 @@ {-# LANGUAGE CPP, OverloadedStrings #-} {-# OPTIONS_GHC -Wall -fwarn-tabs #-}-module Language.Hakaru.Parser.Parser where+module Language.Hakaru.Parser.Parser (parseHakaru, parseHakaruWithImports) where import Prelude hiding (Real) @@ -8,35 +8,37 @@ import Data.Functor ((<$>), (<$)) import Control.Applicative (Applicative(..)) #endif-import qualified Control.Monad as M import Data.Functor.Identity import Data.Text (Text) import qualified Data.Text as Text import Data.Ratio ((%)) import Data.Char (digitToInt)-import Text.Parsec hiding (Empty)+import Text.Parsec import Text.Parsec.Text () -- instances only import Text.Parsec.Indentation import Text.Parsec.Indentation.Char import qualified Text.Parsec.Indentation.Token as ITok-import qualified Text.Parsec.Expr as Ex+import Text.Parsec.Expr (Assoc(..), Operator(..)) import qualified Text.Parsec.Token as Tok import Language.Hakaru.Parser.AST-+import Language.Hakaru.Syntax.IClasses (Some2(..))+import Language.Hakaru.Syntax.AST (allTransforms, transformName) -ops, types, names :: [String]-ops = ["+","*","-","^", "**", ":",".", "<~",- "==", "=", "_", "<|>", "&&", "||"]-types = ["->"]-names = ["def", "fn", "if", "else", "∞", "expect", "observe",- "return", "match", "integrate", "summate", "product",- "data", "import"]+ops, names :: [String]+ops = words "^ ** * / + - . < > <= >= == /= && || <|> -> : <~ = _"+names = concatMap words [ "def fn"+ , "if else match"+ , "return dirac"+ , "integrate summate product from to"+ , "array plate chain of"+ , "r_nop r_split r_index r_fanout r_add bucket"+ , "import data ∞" ] +++ map (\(Some2 t) -> transformName t) allTransforms type ParserStream = IndentStream (CharIndentStream Text) type Parser = ParsecT ParserStream () Identity-type Operator a = Ex.Operator ParserStream () Identity a-type OperatorTable a = [[Operator a]]+type OperatorTable a = [[Operator ParserStream () Identity a]] style :: Tok.GenLanguageDef ParserStream st Identity style = ITok.makeIndentLanguageDef $ Tok.LanguageDef@@ -45,22 +47,14 @@ , Tok.nestedComments = True , Tok.identStart = letter <|> char '_' , Tok.identLetter = alphaNum <|> oneOf "_'"- , Tok.opStart = oneOf "!$%&*+./<=>?@\\^|-~"- , Tok.opLetter = oneOf "!$%&*+./<=>?@\\^|-~"+ , Tok.opStart = oneOf [ c | c:_ <- ops ]+ , Tok.opLetter = oneOf [ c | _:cs <- ops, c <- cs ] , Tok.caseSensitive = True , Tok.commentLine = "#"- , Tok.reservedOpNames = ops ++ types+ , Tok.reservedOpNames = ops , Tok.reservedNames = names } -comments :: Parser ()-comments = string "#"- *> manyTill anyChar newline- *> return ()--emptyLine :: Parser ()-emptyLine = newline *> return ()- lexer :: Tok.GenTokenParser ParserStream () Identity lexer = ITok.makeTokenParser style @@ -70,14 +64,9 @@ decimal :: Parser Integer decimal = Tok.decimal lexer -integer :: Parser Integer-integer = Tok.integer lexer--float :: Parser Rational-float = (decimal >>= fractExponent) <* whiteSpace--fractFloat :: Integer -> Parser (Either Integer Rational)-fractFloat n = fractExponent n >>= return . Right+decimalFloat :: Parser Literal'+decimalFloat = do n <- decimal+ option (Nat n) (Prob <$> fractExponent n) fractExponent :: Integer -> Parser Rational fractExponent n = do{ fract <- fraction@@ -90,181 +79,187 @@ } fraction :: Parser Rational-fraction = do{ _ <- char '.'- ; digits <- many1 digit <?> "fraction"- ; return (foldr op 0 digits)+fraction = do{ d <- try (char '.' *> digit)+ ; digits <- many digit <?> "fraction"+ ; return (foldr1 op (map (fromIntegral.digitToInt) (d:digits))+ / 10) } <?> "fraction" where- op d f = (f + fromIntegral (digitToInt d))/10+ op d f = d + f / 10 exponent' :: Parser Rational exponent' = do{ _ <- oneOf "eE"- ; f <- sign+ ; f <- (negate <$ char '-') <|> (id <$ optional (char '+')) ; e <- decimal <?> "exponent"- ; return (power (f e))+ ; return (10 ^^ f e) } <?> "exponent"- where- power e | e < 0 = 1.0/power(-e)- | otherwise = fromInteger (10^e)- sign = (char '-' >> return negate)- <|> (char '+' >> return id)- <|> return id parens :: Parser a -> Parser a parens = Tok.parens lexer . localIndentation Any -braces :: Parser a -> Parser a-braces = Tok.parens lexer . localIndentation Any- brackets :: Parser a -> Parser a brackets = Tok.brackets lexer . localIndentation Any commaSep :: Parser a -> Parser [a] commaSep = Tok.commaSep lexer -semiSep :: Parser a -> Parser [a]-semiSep = Tok.semiSep lexer--semiSep1 :: Parser a -> Parser [a]-semiSep1 = Tok.semiSep1 lexer- identifier :: Parser Text-identifier = M.liftM Text.pack $ Tok.identifier lexer+identifier = Text.pack <$> Tok.identifier lexer reserved :: String -> Parser ()-reserved = Tok.reserved lexer+reserved s+ | s `elem` names -- assertion+ = Tok.reserved lexer s+ | otherwise+ = error ("Parser failed to reserve the name " ++ show s) reservedOp :: String -> Parser ()-reservedOp = Tok.reservedOp lexer--symbol :: Text -> Parser Text-symbol = M.liftM Text.pack . Tok.symbol lexer . Text.unpack+reservedOp s+ | s `elem` ops -- assertion+ = Tok.reservedOp lexer s+ | otherwise+ = error ("Parser failed to reserve the operator " ++ show s) -app1 :: Text -> AST' Text -> AST' Text-app1 s x@(WithMeta _ m) = WithMeta (Var s `App` x) m-app1 s x = Var s `App` x+app1 :: a -> AST' a -> AST' a+app1 s x = Var s `App` x -app2 :: Text -> AST' Text -> AST' Text -> AST' Text+app2 :: a -> AST' a -> AST' a -> AST' a app2 s x y = Var s `App` x `App` y --- | Smart constructor for divide-divide :: AST' Text -> AST' Text -> AST' Text-divide (ULiteral x') (ULiteral y') = ULiteral (go x' y')- where go :: Literal' -> Literal' -> Literal'- go (Nat x) (Nat y) = Prob (x % y)- go x y = Real (litToRat x / litToRat y)-- litToRat :: Literal' -> Rational- litToRat (Nat x) = toRational x- litToRat (Int x) = toRational x- litToRat (Prob x) = toRational x- litToRat (Real x) = toRational x+divide, sub :: AST' Text -> AST' Text -> AST' Text+divide (WithMeta (ULiteral (Nat x )) (SourceSpan s _))+ (WithMeta (ULiteral (Nat y )) (SourceSpan _ e))+ = (WithMeta (ULiteral (Prob (x % y))) (SourceSpan s e))+divide (WithMeta (ULiteral (Nat 1 )) (SourceSpan _ _))+ y+ = app1 "recip" y divide x y = NaryOp Prod [x, app1 "recip" y]+sub x y = NaryOp Sum [x, app1 "negate" y] -binop :: Text -> AST' Text -> AST' Text -> AST' Text-binop s x y- | s == "+" = NaryOp Sum [x, y]- | s == "-" = NaryOp Sum [x, app1 "negate" y]- | s == "*" = NaryOp Prod [x, y]- | s == "/" = x `divide` y- | s == "<" = app2 "less" x y- | s == ">" = app2 "less" y x- | s == "==" = app2 "equal" x y- | s == "<=" = NaryOp Or [ app2 "less" x y- , app2 "equal" x y]- | s == ">=" = NaryOp Or [ app2 "less" y x- , app2 "equal" x y]- | s == "&&" = NaryOp And [x, y]- | s == "||" = NaryOp Or [x, y]- | s == "<|>" = Msum [x, y]- | otherwise = app2 s x y+bi :: ([a] -> b) -> a -> a -> b+bi f x y = f [x, y] -binary :: String -> Ex.Assoc -> Operator (AST' Text)-binary s = Ex.Infix (binop (Text.pack s) <$ reservedOp s)+negate_rel :: (AST' Text -> AST' Text -> AST' Text)+ -> (AST' Text -> AST' Text -> AST' Text)+negate_rel f x y = app1 "not" (f x y) -prefix :: String -> (a -> a) -> Operator a-prefix s f = Ex.Prefix (f <$ reservedOp s)+binary :: String+ -> Assoc+ -> (a -> a -> a)+ -> Operator ParserStream () Identity a+binary s a f = Infix (f <$ reservedOp s) a -postfix :: Parser (a -> a) -> Operator a-postfix p = Ex.Postfix . chainl1 p . return $ flip (.)+postfix :: Stream s m t+ => ParsecT s u m (AST' a -> AST' a)+ -> Operator s u m (AST' a)+postfix p = Postfix (chainl1 p' (return (flip (.))))+ where p' = do f <- p+ e <- getPosition+ return (\x -> case x of+ WithMeta _ (SourceSpan s _) -> WithMeta (f x) (SourceSpan s e)+ _ -> f x) +sign :: Parser (AST' Text -> AST' Text)+sign = do+ s <- getPosition+ (fNat, fProb, fRest)+ <- ((id , id , id ) <$ reservedOp "+") <|>+ ((negate, negate, app1 "negate") <$ reservedOp "-")+ let f (WithMeta (ULiteral (Nat x )) (SourceSpan _ e))+ = (WithMeta (ULiteral (Int (fNat x))) (SourceSpan s e))+ f (WithMeta (ULiteral (Prob x )) (SourceSpan _ e))+ = (WithMeta (ULiteral (Real (fProb x))) (SourceSpan s e))+ f x = fRest x+ return f+ table :: OperatorTable (AST' Text)-table =- [ [ postfix array_index ]- , [ prefix "+" id ]- , [ binary "^" Ex.AssocRight- , binary "**" Ex.AssocRight]- , [ binary "*" Ex.AssocLeft- , binary "/" Ex.AssocLeft]- , [ binary "+" Ex.AssocLeft- , binary "-" Ex.AssocLeft- , prefix "-" (app1 "negate")]- -- TODO: add "/="- -- TODO: do you *really* mean AssocLeft? Shouldn't they be non-assoc?- , [ postfix ann_expr ]- , [ binary "<|>" Ex.AssocRight]- , [ binary "<" Ex.AssocLeft- , binary ">" Ex.AssocLeft- , binary "<=" Ex.AssocLeft- , binary ">=" Ex.AssocLeft- , binary "==" Ex.AssocLeft]- , [ binary "&&" Ex.AssocLeft]- , [ binary "||" Ex.AssocLeft]]+table = [ [ postfix (array_index <|> fun_call) ]+ , [ binary "^" AssocRight $ app2 "^"+ , binary "**" AssocRight $ app2 "**" ]+ , [ binary "*" AssocLeft $ bi (NaryOp Prod)+ , binary "/" AssocLeft $ divide ]+ , [ Prefix sign+ , binary "+" AssocLeft $ bi (NaryOp Sum)+ , binary "-" AssocLeft $ sub ]+ , [ postfix ann_expr ]+ , [ binary "<" AssocNone $ app2 "less"+ , binary ">" AssocNone $ flip $ app2 "less"+ , binary "<=" AssocNone $ negate_rel $ flip $ app2 "less"+ , binary ">=" AssocNone $ negate_rel $ app2 "less"+ , binary "==" AssocNone $ app2 "equal"+ , binary "/=" AssocNone $ negate_rel $ app2 "equal" ]+ , [ binary "&&" AssocRight $ bi (NaryOp And) ]+ , [ binary "||" AssocRight $ bi (NaryOp Or) ]+ , [ binary "<|>" AssocRight $ bi Msum ] ] -unit_ :: Parser (AST' a)-unit_ = Unit <$ symbol "()"+red_expr :: Parser (Reducer' Text)+red_expr = red_fanout+ <|> red_index+ <|> red_split+ <|> red_nop+ <|> red_add -empty_ :: Parser (AST' a)-empty_ = Empty <$ symbol "[]"+red_fanout :: Parser (Reducer' Text)+red_fanout = reserved "r_fanout" *>+ (R_Fanout+ <$> red_expr+ <* reservedOp "||"+ <*> red_expr+ ) -int :: Parser (AST' a)-int = do- n <- integer- return $- if n < 0- then ULiteral $ Int n- else ULiteral $ Nat n+red_split :: Parser (Reducer' Text)+red_split = reserved "r_split" *>+ (R_Split+ <$> expr+ <* reservedOp ":"+ <*> red_expr+ <* reserved "else"+ <* reservedOp ":"+ <*> red_expr+ ) -floating :: Parser (AST' a)-floating = do- sign <- option '+' (oneOf "+-")- n <- float- return $- case sign of- '-' -> ULiteral $ Real (negate n)- '+' -> ULiteral $ Prob n- _ -> error "floating: the impossible happened"+red_index :: Parser (Reducer' Text)+red_index = reserved "r_index" *>+ (R_Index+ <$> identifier+ <* reservedOp "="+ <*> expr+ <* reserved "of"+ <*> expr+ <* reservedOp ":"+ <*> red_expr+ ) -inf_ :: Parser (AST' Text)+red_nop :: Parser (Reducer' Text)+red_nop = reserved "r_nop" *> return R_Nop++red_add :: Parser (Reducer' Text)+red_add = reserved "r_add" *> (R_Add <$> expr)+++natOrProb :: Parser (AST' a)+natOrProb = (ULiteral <$> decimalFloat) <* whiteSpace++inf_ :: Parser (AST' a) inf_ = reserved "∞" *> return Infinity' var :: Parser (AST' Text) var = Var <$> identifier -pairs :: Parser (AST' Text)-pairs = foldr1 Pair <$> parens (commaSep expr)--type_var :: Parser TypeAST'-type_var = TypeVar <$> identifier--type_app :: Parser TypeAST'-type_app = TypeApp <$> identifier <*> parens (commaSep type_expr)+parenthesized :: Parser (AST' Text)+parenthesized = f <$> parens (commaSep expr)+ where f [] = Unit+ f xs = foldr1 Pair xs -type_fun :: Parser TypeAST'-type_fun =- chainr1- ( try type_app- <|> try type_var- <|> parens type_fun)- (TypeFun <$ reservedOp "->")+type_var_or_app :: Parser TypeAST'+type_var_or_app = do x <- ("array" <$ reserved "array") <|> identifier+ option (TypeVar x) (TypeApp x <$> parens (commaSep type_expr)) type_expr :: Parser TypeAST'-type_expr = try type_fun- <|> try type_app- <|> try type_var- <|> parens type_expr+type_expr = foldr1 TypeFun <$> sepBy1 (parens type_expr <|> type_var_or_app)+ (reservedOp "->") ann_expr :: Parser (AST' Text -> AST' Text) ann_expr = reservedOp "." *> (flip Ann <$> type_expr)@@ -275,8 +270,8 @@ pat_expr :: Parser (Pattern' Text) pat_expr = try (PData' <$> pdat_expr) <|> (PData' <$> (DV "pair" <$> parens (commaSep pat_expr)))- <|> (PWild' <$ reservedOp "_")- <|> (PVar' <$> identifier)+ <|> (PWild' <$ reservedOp "_")+ <|> (PVar' <$> identifier) -- | Blocks are indicated by colons, and must be indented.@@ -286,42 +281,25 @@ localIndentation Gt (many $ absoluteIndentation p) --- | Semiblocks are like blocks, but indentation is optional. Also,--- there are only 'expr' semiblocks.-semiblockExpr :: Parser (AST' Text)-semiblockExpr = reservedOp ":" *> localIndentation Ge expr----- | Pseudoblocks seem like semiblocks, but actually they aren't--- indented.------ TODO: do we actually want this in our grammar, or did we really--- mean to use 'semiblockExpr' instead?-pseudoblockExpr :: Parser (AST' Text)-pseudoblockExpr = reservedOp ":" *> expr-- branch_expr :: Parser (Branch' Text)-branch_expr = Branch' <$> pat_expr <*> semiblockExpr+branch_expr = Branch' <$> pat_expr <* reservedOp ":"+ <*> localIndentation Gt expr match_expr :: Parser (AST' Text)-match_expr =- reserved "match"- *> (Case- <$> expr- <*> blockOfMany branch_expr- )+match_expr = Case <$ reserved "match" <*> expr <* reservedOp ":"+ <*> localIndentation Ge (many (absoluteIndentation branch_expr)) integrate_expr :: Parser (AST' Text) integrate_expr = reserved "integrate" *> (Integrate <$> identifier- <* symbol "from"+ <* reserved "from" <*> expr- <* symbol "to"+ <* reserved "to" <*> expr- <*> semiblockExpr+ <* reservedOp ":"+ <*> expr ) summate_expr :: Parser (AST' Text)@@ -329,11 +307,12 @@ reserved "summate" *> (Summate <$> identifier- <* symbol "from"+ <* reserved "from" <*> expr- <* symbol "to"+ <* reserved "to" <*> expr- <*> semiblockExpr+ <* reservedOp ":"+ <*> expr ) product_expr :: Parser (AST' Text)@@ -341,28 +320,55 @@ reserved "product" *> (Product <$> identifier- <* symbol "from"+ <* reserved "from" <*> expr- <* symbol "to"+ <* reserved "to" <*> expr- <*> semiblockExpr+ <* reservedOp ":"+ <*> expr ) -expect_expr :: Parser (AST' Text)-expect_expr =- reserved "expect"- *> (Expect+transform_expr :: Parser (AST' Text)+transform_expr = expect_expr <|> tr+ where+ trNm :: Parser Transform'+ trNm = choice $+ map (\(Some2 t) -> reserved (transformName t)+ *> pure (trFromTyped t))+ allTransforms++ sarg :: Parser ([Text], AST' Text)+ sarg = (,)+ <$> option [] (try (many1 identifier <* reservedOp ":"))+ <*> expr++ tr :: Parser (AST' Text)+ tr = Transform+ <$> trNm+ <*> (SArgs' <$> parens (commaSep sarg))++ expect_expr :: Parser (AST' Text)+ expect_expr =+ reserved "expect"+ *> (_Expect+ <$> identifier+ <* reservedOp "<~"+ <*> expr+ <* reservedOp ":"+ <*> expr+ )++bucket_expr :: Parser (AST' Text)+bucket_expr =+ reserved "bucket"+ *> (Bucket <$> identifier+ <* reserved "from" <*> expr- <*> semiblockExpr- )--observe_expr :: Parser (AST' Text)-observe_expr =- reserved "observe"- *> (Observe- <$> expr+ <* reserved "to" <*> expr+ <* reservedOp ":"+ <*> red_expr ) array_expr :: Parser (AST' Text)@@ -370,49 +376,46 @@ reserved "array" *> (Array <$> identifier- <* symbol "of"+ <* reserved "of" <*> expr- <*> semiblockExpr+ <* reservedOp ":"+ <*> expr ) array_index :: Parser (AST' Text -> AST' Text) array_index = flip Index <$> brackets expr array_literal :: Parser (AST' Text)-array_literal = checkEmpty <$> brackets (commaSep expr)- where checkEmpty [] = Empty- checkEmpty xs = ArrayLiteral xs+array_literal = ArrayLiteral <$> brackets (commaSep expr) plate_expr :: Parser (AST' Text) plate_expr = reserved "plate" *> (Plate <$> identifier- <* symbol "of"+ <* reserved "of" <*> expr- <*> semiblockExpr+ <* reservedOp ":"+ <*> expr ) chain_expr :: Parser (AST' Text) chain_expr = reserved "chain"- *> (Chain+ *> (flip . Chain <$> identifier+ <* reserved "from" <*> expr+ <* reserved "of" <*> expr- <*> semiblockExpr+ <* reservedOp ":"+ <*> expr ) if_expr :: Parser (AST' Text)-if_expr =- reserved "if"- *> (If- <$> localIndentation Ge expr- <*> semiblockExpr- <* reserved "else"- <*> semiblockExpr- )+if_expr = If <$ reserved "if" <*> expr <* reservedOp ":" <*> expr+ <* reserved "else" <* reservedOp ":" <*> expr lam_expr :: Parser (AST' Text) lam_expr =@@ -420,80 +423,73 @@ *> (Lam <$> identifier <*> type_expr- <*> semiblockExpr+ <* reservedOp ":"+ <*> expr ) bind_expr :: Parser (AST' Text)-bind_expr = Bind- <$> identifier- <* reservedOp "<~"- <*> expr- <*> expr+bind_expr = localIndentation Ge+ (absoluteIndentation (try (Bind <$> identifier <* reservedOp "<~")+ <*> localIndentation Gt expr)+ <*> absoluteIndentation expr) let_expr :: Parser (AST' Text)-let_expr = Let- <$> identifier- <* reservedOp "="- <*> expr- <*> expr+let_expr = localIndentation Ge+ (absoluteIndentation (try (Let <$> identifier <* reservedOp "=")+ <*> localIndentation Gt expr)+ <*> absoluteIndentation expr) def_expr :: Parser (AST' Text)-def_expr = do- reserved "def"+def_expr = localIndentation Ge $ do+ absoluteIndentation (reserved "def") name <- identifier vars <- parens (commaSep defarg) bodyTyp <- optionMaybe type_expr- body <- semiblockExpr+ reservedOp ":"+ body <- localIndentation Gt expr let body' = foldr (\(var', varTyp) e -> Lam var' varTyp e) body vars typ = foldr TypeFun <$> bodyTyp <*> return (map snd vars) Let name (maybe id (flip Ann) typ body')- <$> expr -- the \"rest\"; i.e., where the 'def' is in scope+ <$> absoluteIndentation expr -- the \"rest\"; i.e., where the 'def' is in scope defarg :: Parser (Text, TypeAST') defarg = (,) <$> identifier <*> type_expr -call_expr :: Parser (AST' Text)-call_expr =- foldl App- <$> (Var <$> identifier)- <*> parens (commaSep expr)+fun_call :: Parser (AST' Text -> AST' Text)+fun_call = flip (foldl App) <$> parens (commaSep expr) return_expr :: Parser (AST' Text) return_expr = do reserved "return" <|> reserved "dirac"- Dirac <$> expr+ app1 "dirac" <$> expr term :: Parser (AST' Text)-term = try if_expr- <|> try return_expr- <|> try lam_expr- <|> try def_expr- <|> try match_expr- <|> try data_expr- <|> try integrate_expr- <|> try summate_expr- <|> try product_expr- <|> try expect_expr- <|> try observe_expr- <|> try array_expr- <|> try plate_expr- <|> try chain_expr- <|> try let_expr- <|> try bind_expr- <|> try call_expr- <|> try array_literal- <|> try floating- <|> try inf_- <|> try unit_- <|> try empty_- <|> try int- <|> try var- <|> try pairs- <|> parens expr- <?> "an expression"+term = if_expr+ <|> lam_expr+ <|> def_expr+ <|> match_expr+ <|> data_expr+ <|> integrate_expr+ <|> summate_expr+ <|> product_expr+ <|> transform_expr+ <|> bucket_expr+ <|> array_expr+ <|> plate_expr+ <|> chain_expr+ <|> array_literal+ <|> inf_+ <|> natOrProb+ <|> var+ <|> parenthesized+ <?> "simple expression" expr :: Parser (AST' Text)-expr = withPos (Ex.buildExpressionParser table (withPos term) <?> "an expression")+expr = withPos (let_expr <|>+ bind_expr <|>+ return_expr <|>+ buildExpressionParser table (withPos term))+ <?> "expression" indentConfig :: Text -> ParserStream@@ -506,10 +502,10 @@ parseHakaruWithImports :: Text -> Either ParseError (ASTWithImport' Text) parseHakaruWithImports = parseAtTopLevel exprWithImport -parseAtTopLevel :: Parser a -> Text -> Either ParseError a -parseAtTopLevel p = - runParser (skipMany (comments <|> emptyLine) *>- p <* eof) () "<input>" . indentConfig . Text.strip +parseAtTopLevel :: Parser a -> Text -> Either ParseError a+parseAtTopLevel p =+ runParser (whiteSpace *>+ p <* eof) () "<input>" . indentConfig withPos :: Parser (AST' a) -> Parser (AST' a) withPos x = do@@ -535,7 +531,7 @@ reserved "data" ident <- identifier typvars <- parens (commaSep identifier)- ts <- blockOfMany (try type_app <|> type_var)+ ts <- blockOfMany type_var_or_app e <- expr return (Data ident typvars ts e) @@ -545,3 +541,98 @@ exprWithImport :: Parser (ASTWithImport' Text) exprWithImport = ASTWithImport' <$> (many import_expr) <*> expr++-- | A variant of @Text.Parsec.Expr.buildExpressionParser@ (parsec-3.1.11)+-- that behaves more restrictively when a precedence level contains both+-- unary and binary operators. Unary operators are only allowed on the+-- first operand when parsing left-associatively and on the last operand+-- when parsing right-associatively. This restriction lets us recover the+-- behavior of unary negation in Haskell.++buildExpressionParser :: (Stream s m t)+ => [[Operator s u m a]]+ -> ParsecT s u m a+ -> ParsecT s u m a+buildExpressionParser operators simpleExpr+ = foldl (makeParser) simpleExpr operators+ where+ makeParser term' ops'+ = let (rassoc,lassoc,nassoc+ ,prefix,postfix') = foldr splitOp ([],[],[],[],[]) ops'++ rassocOp = choice rassoc+ lassocOp = choice lassoc+ nassocOp = choice nassoc+ prefixOp = choice prefix <?> ""+ postfixOp = choice postfix' <?> ""++ ambigious assoc op= try $+ do{ _ <- op+ ; fail ("ambiguous use of a " ++ assoc+ ++ " associative operator")+ }++ ambigiousRight = ambigious "right" rassocOp+ ambigiousLeft = ambigious "left" lassocOp+ ambigiousNon = ambigious "non" nassocOp++ termP = do{ (preU, pre) <- prefixP+ ; x <- term'+ ; (postU, post) <- postfixP+ ; return (preU || postU, post (pre x))+ }++ postfixP = ((,) True) <$> postfixOp <|> return (False, id)++ prefixP = ((,) True) <$> prefixOp <|> return (False, id)++ rassocP x = do{ f <- rassocOp+ ; (u, z) <- termP+ ; y <- if u then return z else rassocP1 z+ ; return (f x y)+ }+ <|> ambigiousLeft+ <|> ambigiousNon+ -- <|> return x++ rassocP1 x = rassocP x <|> return x++ lassocP x = do{ f <- lassocOp+ ; y <- term'+ ; lassocP1 (f x y)+ }+ <|> ambigiousRight+ <|> ambigiousNon+ -- <|> return x++ lassocP1 x = lassocP x <|> return x++ nassocP x = do{ f <- nassocOp+ ; y <- term'+ ; ambigiousRight+ <|> ambigiousLeft+ <|> ambigiousNon+ <|> return (f x y)+ }+ -- <|> return x++ in do{ (u, x) <- termP+ ; (if u then parserZero else rassocP x)+ <|> lassocP x+ <|> (if u then parserZero else nassocP x)+ <|> return x+ <?> "operator"+ }+++ splitOp (Infix op assoc) (rassoc,lassoc,nassoc,prefix,postfix')+ = case assoc of+ AssocNone -> (rassoc,lassoc,op:nassoc,prefix,postfix')+ AssocLeft -> (rassoc,op:lassoc,nassoc,prefix,postfix')+ AssocRight -> (op:rassoc,lassoc,nassoc,prefix,postfix')++ splitOp (Prefix op) (rassoc,lassoc,nassoc,prefix,postfix')+ = (rassoc,lassoc,nassoc,op:prefix,postfix')++ splitOp (Postfix op) (rassoc,lassoc,nassoc,prefix,postfix')+ = (rassoc,lassoc,nassoc,prefix,op:postfix')
haskell/Language/Hakaru/Parser/SymbolResolve.hs view
@@ -3,9 +3,15 @@ , DataKinds , KindSignatures , GADTs+ , LambdaCase+ , PolyKinds+ , RankNTypes #-} {-# OPTIONS_GHC -Wall -fwarn-tabs #-}-module Language.Hakaru.Parser.SymbolResolve where+module Language.Hakaru.Parser.SymbolResolve+ (+ resolveAST, resolveAST', makeName, fromVarSet+ ) where import Data.Text hiding (concat, map, maximum, foldr1, singleton) #if __GLASGOW_HASKELL__ < 710@@ -13,6 +19,7 @@ import Control.Applicative ((<*>)) #endif import Control.Monad.Trans.State.Strict (State, state, evalState)+import Control.Monad (join) import qualified Data.Number.Nat as N import qualified Data.IntMap as IM@@ -25,11 +32,12 @@ import Language.Hakaru.Types.DataKind hiding (Symbol) import Language.Hakaru.Types.HClasses import qualified Language.Hakaru.Syntax.AST as T-import Language.Hakaru.Syntax.ABT+import Language.Hakaru.Syntax.ABT hiding (fromVarSet) import Language.Hakaru.Syntax.IClasses import Language.Hakaru.Syntax.Variable () import qualified Language.Hakaru.Parser.AST as U import Language.Hakaru.Evaluation.Coalesce (coalesce)+import qualified Language.Hakaru.Syntax.Prelude as P data Symbol a = TLam (a -> Symbol a)@@ -99,15 +107,15 @@ ,("true", TNeu $ true_) ,("false", TNeu $ false_) -- Coercions- ,("int2nat", primUnsafe cNat2Int)+ ,("int2nat", primUnsafe cNat2Int) -- unsafe, wrong direction ,("int2real", primCoerce cInt2Real) ,("prob2real", primCoerce cProb2Real)- ,("real2prob", primUnsafe cProb2Real)+ ,("real2prob", primUnsafe cProb2Real) -- unsafe, wrong direction ,("nat2real", primCoerce cNat2Real) ,("nat2prob", primCoerce cNat2Prob) ,("nat2int", primCoerce cNat2Int) -- Measures- ,("lebesgue", TNeu $ syn $ U.MeasureOp_ (U.SomeOp T.Lebesgue) [])+ ,("lebesgue", primMeasure2 (U.SomeOp T.Lebesgue)) ,("counting", TNeu $ syn $ U.MeasureOp_ (U.SomeOp T.Counting) []) ,("uniform", primMeasure2 (U.SomeOp T.Uniform)) ,("normal", primMeasure2 (U.SomeOp T.Normal))@@ -121,8 +129,13 @@ ,("reject", TNeu $ syn U.Reject_) -- PrimOps ,("not", primPrimOp1 U.Not)+ ,("impl", primPrimOp2 U.Impl)+ ,("diff", primPrimOp2 U.Diff)+ ,("nand", primPrimOp2 U.Nand)+ ,("nor", primPrimOp2 U.Nor) ,("pi", primPrimOp0 U.Pi) ,("**", primPrimOp2 U.RealPow)+ ,("choose", primPrimOp2 U.Choose) ,("cos", primPrimOp1 U.Cos) ,("exp", primPrimOp1 U.Exp) ,("log", primPrimOp1 U.Log)@@ -151,12 +164,19 @@ ,("asinh", primPrimOp1 U.Asinh) ,("acosh", primPrimOp1 U.Acosh) ,("atanh", primPrimOp1 U.Atanh)+ ,("floor", primPrimOp1 U.Floor) -- ArrayOps ,("size", TLam $ \x -> TNeu . syn $ U.ArrayOp_ U.Size [x]) ,("reduce", t3 $ \x y z -> syn $ U.ArrayOp_ U.Reduce [x, y, z]) -- NaryOps+ ,("xor", t2 $ \x y -> syn $ U.NaryOp_ U.Xor [x, y])+ ,("iff", t2 $ \x y -> syn $ U.NaryOp_ U.Iff [x, y]) ,("min", t2 $ \x y -> syn $ U.NaryOp_ U.Min [x, y]) ,("max", t2 $ \x y -> syn $ U.NaryOp_ U.Max [x, y])++ -- Macros+ ,("weibull", TNeu $ syn $ U.InjTyped $+ P.lam $ \x -> P.lam $ \y -> P.weibull x y) ] primPrimOp0, primPrimOp1, primPrimOp2 :: U.PrimOp -> Symbol U.AST@@ -262,6 +282,19 @@ <$> symbolResolution symbols e1 <*> symbolResolution (insertSymbol name' symbols) e2 +resolveTransform+ :: SymbolTable+ -> U.Transform'+ -> U.SArgs' Text+ -> State Int (U.AST' (Symbol U.AST))+resolveTransform symbols tr (U.SArgs' es) =+ U.Transform tr . U.SArgs' <$> mapM go es where+ go :: ([Text], U.AST' Text)+ -> State Int ([Symbol U.AST], U.AST' (Symbol U.AST))+ go (nms,x) = do+ nms' <- mapM gensym nms+ (,) (map mkSym nms') <$>+ symbolResolution (insertSymbols nms' symbols) x -- TODO: clean up by merging the @Reader (SymbolTable)@ and @State Int@ monads -- | Figure out symbols and types.@@ -327,7 +360,6 @@ <$> mapM (symbolResolution symbols) es U.Unit -> return $ U.Unit- U.Empty -> return $ U.Empty U.Pair e1 e2 -> U.Pair <$> symbolResolution symbols e1 <*> symbolResolution symbols e2@@ -344,19 +376,15 @@ <$> symbolResolution symbols e1 <*> mapM (symbolResolveBranch symbols) bs - U.Dirac e1 -> U.Dirac <$> symbolResolution symbols e1 U.Bind name e1 e2 -> resolveBinder symbols name e1 e2 U.Bind U.Plate name e1 e2 -> resolveBinder symbols name e1 e2 U.Plate- U.Expect name e1 e2 -> resolveBinder symbols name e1 e2 U.Expect+ U.Transform tr es -> resolveTransform symbols tr es U.Chain name e1 e2 e3 -> do name' <- gensym name U.Chain (mkSym name') <$> symbolResolution symbols e1 <*> symbolResolution symbols e2 <*> symbolResolution (insertSymbol name' symbols) e3- U.Observe e1 e2 -> U.Observe- <$> symbolResolution symbols e1- <*> symbolResolution symbols e2 U.Msum es -> U.Msum <$> mapM (symbolResolution symbols) es @@ -432,10 +460,11 @@ U.Var a -> U.Var a U.Lam name typ f -> U.Lam name typ (normAST f) U.App f x ->- let x' = normAST x in- case normAST f of+ let x' = normAST x+ f' = normAST f in+ case U.withoutMeta f' of U.Var (TLam f) -> U.Var $ f (makeAST x')- f' -> U.App f' x'+ _ -> U.App f' x' U.Let name e1 e2 -> U.Let name (normAST e1) (normAST e2) U.If e1 e2 e3 -> U.If (normAST e1) (normAST e2) (normAST e3)@@ -448,23 +477,23 @@ U.ULiteral v -> U.ULiteral v U.NaryOp op es -> U.NaryOp op (map normAST es) U.Unit -> U.Unit- U.Empty -> U.Empty U.Pair e1 e2 -> U.Pair (normAST e1) (normAST e2) U.Array name e1 e2 -> U.Array name (normAST e1) (normAST e2) U.ArrayLiteral es -> U.ArrayLiteral (map normAST es) U.Index e1 e2 -> U.Index (normAST e1) (normAST e2) U.Case e1 e2 -> U.Case (normAST e1) (map branchNorm e2)- U.Dirac e1 -> U.Dirac (normAST e1) U.Bind name e1 e2 -> U.Bind name (normAST e1) (normAST e2) U.Plate name e1 e2 -> U.Plate name (normAST e1) (normAST e2) U.Chain name e1 e2 e3 -> U.Chain name (normAST e1) (normAST e2) (normAST e3)- U.Expect name e1 e2 -> U.Expect name (normAST e1) (normAST e2)- U.Observe e1 e2 -> U.Observe (normAST e1) (normAST e2)+ U.Transform tr es -> U.Transform tr (normSArgs es) U.Msum es -> U.Msum (map normAST es) U.Data name tvars typs e -> U.Data name tvars typs e -- do we need to norm here? what if we try to define `true` which is already a constructor U.WithMeta a meta -> U.WithMeta (normAST a) meta +normSArgs :: U.SArgs' (Symbol U.AST) -> U.SArgs' (Symbol U.AST)+normSArgs (U.SArgs' es) = U.SArgs' $ map (fmap normAST) es+ branchNorm :: U.Branch' (Symbol U.AST) -> U.Branch' (Symbol U.AST) branchNorm (U.Branch' pat e2') = U.Branch' pat (normAST e2') branchNorm (U.Branch'' pat e2') = U.Branch'' pat (normAST e2')@@ -576,7 +605,6 @@ U.ULiteral v -> syn $ U.Literal_ (U.val v) U.NaryOp op es -> syn $ U.NaryOp_ op (map makeAST es) U.Unit -> unit_- U.Empty -> syn $ U.Empty_ U.Pair e1 e2 -> syn $ U.Pair_ (makeAST e1) (makeAST e2) U.Array s e1 e2 -> withName "U.Array" s $ \name ->@@ -584,7 +612,6 @@ U.ArrayLiteral es -> syn $ U.ArrayLiteral_ (map makeAST es) U.Index e1 e2 -> syn $ U.ArrayOp_ U.Index_ [(makeAST e1), (makeAST e2)] U.Case e bs -> syn $ U.Case_ (makeAST e) (map makeBranch bs)- U.Dirac e1 -> syn $ U.Dirac_ (makeAST e1) U.Bind s e1 e2 -> withName "U.Bind" s $ \name -> syn $ U.MBind_ (makeAST e1) (bind name $ makeAST e2)@@ -606,15 +633,74 @@ U.Bucket s e1 e2 e3 -> withName "U.Bucket" s $ \name -> syn $ U.Bucket_ (makeAST e1) (makeAST e2) (makeReducerAST name e3 Nil1)- U.Expect s e1 e2 ->- withName "U.Expect" s $ \name ->- syn $ U.Expect_ (makeAST e1) (bind name $ makeAST e2)- U.Observe e1 e2 -> syn $ U.Observe_ (makeAST e1) (makeAST e2)+ U.Transform tr es -> makeTransform tr es U.Msum es -> collapseSuperposes (map makeAST es)- U.Data name tvars typs e -> error "TODO: makeAST{U.Data}" U.WithMeta a meta -> withMetadata meta (makeAST a) +makeTransform :: U.Transform' -> U.SArgs' (Symbol U.AST) -> U.AST+makeTransform tru esu =+ case typedTransform tru of+ Some2 tr ->+ let wrongArgsErr = error $ "Wrong number of arguments passed to " +++ T.transformName tr+ res = U.Transform_ tr <$> matchSArgs (transformArgs tr) esu+ in maybe wrongArgsErr syn res++type SVarsSpine = (List1 (Lift1 ()) :: [k] -> *)+type SArgsSpine = (List1 (PointwiseP SVarsSpine (Lift1 ())) :: [([k],k1)] -> *)++transformArgs :: T.Transform xs a -> SArgsSpine xs+transformArgs t =+ let arg0 = PwP Nil1 (Lift1 ())+ arg1 = PwP (Cons1 (Lift1 ()) Nil1) (Lift1 ())+ in case t of+ -- TODO: can SingI be generalized to allow things which aren't `Sing's+ -- so these right hand sides can become `sing'?+ T.Observe -> Cons1 arg0 $ Cons1 arg0 Nil1+ T.MH -> Cons1 arg0 $ Cons1 arg0 Nil1+ T.MCMC -> Cons1 arg0 $ Cons1 arg0 Nil1+ T.Disint k -> Cons1 arg0 Nil1+ T.Summarize -> Cons1 arg0 Nil1+ T.Simplify -> Cons1 arg0 Nil1+ T.Reparam -> Cons1 arg0 Nil1+ T.Expect -> Cons1 arg0 $ Cons1 arg1 Nil1++matchSArgs :: SArgsSpine xs -> U.SArgs' (Symbol U.AST)+ -> Maybe (U.SArgs U.U_ABT xs)+matchSArgs sp (U.SArgs' es) =+ case (sp, es) of+ ( Nil1, [] ) -> Just U.End+ ( Cons1 (PwP vs _) sp', (vs',e0):es' )+ -> join $ matchSVars vs vs' e0 $ \vsu e0' ->+ (U.:*) (vsu, e0') <$> matchSArgs sp' (U.SArgs' es')+ _ -> Nothing++matchSVars :: SVarsSpine vs -> [Symbol U.AST] -> U.AST' (Symbol U.AST)+ -> (forall vsu . List2 U.ToUntyped vs vsu+ -> U.U_ABT vsu 'U.U+ -> r)+ -> Maybe r+matchSVars vs nms e k =+ case (vs, nms) of+ (Nil1 , [] ) -> Just $ k Nil2 (makeAST e)+ (Cons1 v vs', nm:nms') ->+ matchSVars vs' nms' e $ \vsu e' ->+ withName "U.SArgs" nm $ \nm' ->+ k (Cons2 U.ToU vsu) (bind nm' e')+ _ -> Nothing++typedTransform :: U.Transform' -> Some2 T.Transform+typedTransform = \case+ U.Observe -> Some2 T.Observe+ U.MH -> Some2 T.MH+ U.MCMC -> Some2 T.MCMC+ U.Disint k -> Some2 $ T.Disint k+ U.Summarize -> Some2 T.Summarize+ U.Simplify -> Some2 T.Simplify+ U.Reparam -> Some2 T.Reparam+ U.Expect -> Some2 T.Expect+ withName :: String -> Symbol U.AST -> (Variable 'U.U -> r) -> r withName fun s k = case s of@@ -629,19 +715,20 @@ evalState (symbolResolution primTable ast) 0 resolveAST'- :: [U.Name]+ :: N.Nat+ -> [U.Name] -> U.AST' Text -> U.AST-resolveAST' syms ast =+resolveAST' nextVar syms ast = coalesce . makeAST . normAST $ evalState (symbolResolution (insertSymbols syms primTable) ast)- (nextVarID_ syms)+ (N.fromNat $ nextVarID_ syms) where- nextVarID_ [] = N.fromNat 0- nextVarID_ xs = N.fromNat . (1+) . F.maximum $ map U.nameID xs+ nextVarID_ [] = nextVar+ nextVarID_ xs = max nextVar . (1+) . F.maximum $ map U.nameID xs makeName :: SomeVariable ('KProxy :: KProxy Hakaru) -> U.Name makeName (SomeVariable (Variable hint vID _)) = U.Name vID hint
haskell/Language/Hakaru/Pretty/Concrete.hs view
@@ -7,6 +7,7 @@ , TypeOperators , FlexibleContexts , UndecidableInstances+ , LambdaCase #-} {-# OPTIONS_GHC -Wall -fwarn-tabs #-}@@ -28,29 +29,34 @@ pretty , prettyPrec , prettyType- , prettyAssoc- , prettyPrecAssoc , prettyValue+ , prettyT+ , prettyTypeT, prettyTypeS -- * Helper functions (semi-public internal API) ) where -import System.Console.ANSI-import Text.PrettyPrint (Doc, (<>), (<+>))-import qualified Text.PrettyPrint as PP-import qualified Data.Foldable as F-import qualified Data.List.NonEmpty as L-import qualified Data.Text as Text+import Prelude hiding ((<>))+import Text.PrettyPrint (Doc, text, integer, double,+ (<+>), (<>), ($$), sep, cat, fsep, vcat,+ nest, parens, brackets, punctuate,+ comma, colon, equals)+import qualified Data.Foldable as F+import qualified Data.List.NonEmpty as L+import qualified Data.Text as Text -- Because older versions of "Data.Foldable" do not export 'null' apparently...-import qualified Data.Sequence as Seq-import qualified Data.Vector as V+import qualified Data.Sequence as Seq+import qualified Data.Vector as V import Data.Ratio+import qualified Data.Text as T+import Control.Applicative (Applicative(..)) -import Data.Number.Natural (fromNatural, fromNonNegativeRational)+import Data.Number.Natural (fromNatural, fromNonNegativeRational) import Data.Number.Nat-import qualified Data.Number.LogFloat as LF+import qualified Data.Number.LogFloat as LF -import Language.Hakaru.Syntax.IClasses (fmap11, foldMap11, jmEq1, TypeEq(..))+import Language.Hakaru.Syntax.IClasses (fmap11, foldMap11, jmEq1, TypeEq(..)+ ,Foldable21(..)) import Language.Hakaru.Types.DataKind import Language.Hakaru.Types.Sing import Language.Hakaru.Types.Coercion@@ -58,230 +64,247 @@ import Language.Hakaru.Syntax.AST import Language.Hakaru.Syntax.Datum import Language.Hakaru.Syntax.Value+import Language.Hakaru.Syntax.Reducer import Language.Hakaru.Syntax.ABT-import Language.Hakaru.Pretty.Haskell- (ppRatio, prettyAssoc, prettyPrecAssoc, Associativity(..))+import Language.Hakaru.Pretty.Haskell (Associativity(..)) ---------------------------------------------------------------- -- | Pretty-print a term. pretty :: (ABT Term abt) => abt '[] a -> Doc pretty = prettyPrec 0 +-- | Pretty print a term as a Text+prettyT :: (ABT Term abt) => abt '[] a -> T.Text+prettyT = T.pack . show . pretty +-- | Pretty-print a type as a Text+prettyTypeT :: Sing (a :: Hakaru) -> T.Text+prettyTypeT = T.pack . show . prettyType 0++-- | Pretty-print a type as a String+prettyTypeS :: Sing (a :: Hakaru) -> String+prettyTypeS = show . prettyType 0+ -- | Pretty-print a term at a given precendence level. prettyPrec :: (ABT Term abt) => Int -> abt '[] a -> Doc-prettyPrec p = toDoc . prettyPrec_ p . LC_+prettyPrec p = prettyPrec_ p . LC_ ---------------------------------------------------------------- class Pretty (f :: Hakaru -> *) where -- | A polymorphic variant if 'prettyPrec', for internal use.- prettyPrec_ :: Int -> f a -> Docs+ prettyPrec_ :: Int -> f a -> Doc -type Docs = [Doc] +mapInit :: (a -> a) -> [a] -> [a]+mapInit f (x:xs@(_:_)) = f x : mapInit f xs+mapInit _ xs = xs --- So far as I can tell from the documentation, if the input is a singleton list then the result is the same as that singleton.-toDoc :: Docs -> Doc-toDoc = PP.cat+sepByR :: String -> [Doc] -> Doc+sepByR s = sep . mapInit (<+> text s) --- | Color a Doc-color :: Color -> Doc -> Doc-color c d =- PP.text (setSGRCode [SetColor Foreground Dull c])- <> d- <> PP.text (setSGRCode [Reset])+sepComma :: [Doc] -> Doc+sepComma = fsep . punctuate comma+ -- It's safe to use fsep here despite our indentation-sensitive syntax,+ -- because commas are not a binary operator. -keyword :: Doc -> Doc-keyword = color Red+parensIf :: Bool -> Doc -> Doc+parensIf False = id+parensIf True = parens -- | Pretty-print a variable. ppVariable :: Variable (a :: Hakaru) -> Doc-ppVariable x = hint- where- hint- | Text.null (varHint x) = PP.char 'x' <> (PP.int . fromNat . varID) x -- We used to use '_' but...- | otherwise = (PP.text . Text.unpack . varHint) x--ppVariableWithType :: Variable (a :: Hakaru) -> (Doc, Doc)-ppVariableWithType x = (hint, (prettyType 0 . varType) x)- where- hint- | Text.null (varHint x) = PP.char 'x' <> (PP.int . fromNat . varID) x -- We used to use '_' but...- | otherwise = (PP.text . Text.unpack . varHint) x+ppVariable x+ | Text.null (varHint x) = text ('x' : show (fromNat (varID x))) -- We used to use '_' but...+ | otherwise = text (Text.unpack (varHint x)) --- BUG: we still use this in a few places. I'm pretty sure they should all actually be 'ppBinder2', in which case we can delete this function and just use that one.-ppBinder :: (ABT Term abt) => abt xs a -> Docs-ppBinder e =- case go [] (viewABT e) of- ([], body) -> body- (vars,body) -> PP.char '\\' <> PP.sep vars <+> PP.text "-> " : body+ppBinder :: (ABT Term abt) => abt xs a -> ([Doc], Doc)+ppBinder e = go [] (viewABT e) where- go :: (ABT Term abt) => [Doc] -> View (Term abt) xs a -> ([Doc],Docs)+ go :: (ABT Term abt) => [Doc] -> View (Term abt) xs a -> ([Doc], Doc) go xs (Bind x v) = go (ppVariable x : xs) v- go xs (Var x) = (reverse xs, [ppVariable x])- go xs (Syn t) = (reverse xs, prettyPrec_ 0 (LC_ (syn t)))---ppBinder2prec :: (ABT Term abt) => Int -> abt xs a -> ([Doc], [Doc], Docs)-ppBinder2prec p e = unpackVarTypes $ go [] (viewABT e)- where- unpackVarTypes (varTypes, body) =- (map fst varTypes, map snd varTypes, body)+ go xs (Var x) = (reverse xs, ppVariable x)+ go xs (Syn t) = (reverse xs, pretty (syn t)) - go :: (ABT Term abt) => [(Doc, Doc)] -> View (Term abt) xs a -> ([(Doc, Doc)],Docs)- go xs (Bind x v) = go (ppVariableWithType x : xs) v- go xs (Var x) = (reverse xs, [ppVariable x])- go xs (Syn t) = (reverse xs, prettyPrec_ p (LC_ (syn t)))+ppBinderAsFun :: forall abt xs a . ABT Term abt => abt xs a -> Doc+ppBinderAsFun e =+ let (vars, body) = ppBinder e in+ if null vars then body else sep [fsep vars <> colon, body] -ppBinder2 :: (ABT Term abt) => abt xs a -> ([Doc], [Doc], Docs)-ppBinder2 = ppBinder2prec 0 +ppBinder1 :: (ABT Term abt) => abt '[x] a -> (Doc, Doc, Doc)+ppBinder1 e = caseBind e $ \x v ->+ (ppVariable x,+ prettyType 0 (varType x),+ caseVarSyn v ppVariable (pretty . syn)) -- TODO: since switching to ABT2, this instance requires -XFlexibleContexts; we should fix that if we can -- BUG: since switching to ABT2, this instance requires -XUndecidableInstances; must be fixed! instance (ABT Term abt) => Pretty (LC_ abt) where prettyPrec_ p (LC_ e) =- caseVarSyn e ((:[]) . ppVariable) $ \t ->+ caseVarSyn e ppVariable $ \t -> case t of o :$ es -> ppSCon p o es NaryOp_ o es -> if Seq.null es then identityElement o else case o of- And -> parens (p > 3)- . PP.punctuate (PP.text " && ")- . map (prettyPrec 3)- $ F.toList es- Or -> parens (p > 2)- . PP.punctuate (PP.text " || ")- . map (prettyPrec 2)- $ F.toList es- Xor -> parens (p > 0)- . PP.punctuate (PP.text " != ")- . map (prettyPrec 0)- $ F.toList es- -- BUG: even though 'Iff' is associative (in Boolean algebras), we should not support n-ary uses in our *surface* syntax. Because it's too easy for folks to confuse "a <=> b <=> c" with "(a <=> b) /\ (b <=> c)".- Iff -> [F.foldl1 (\a b -> toDoc $ ppFun p "iff" [a, b])- (fmap (toDoc . ppArg) es)]- (Min _) -> [F.foldl1 (\a b -> toDoc $ ppFun p "min" [a, b])- (fmap (toDoc . ppArg) es)]- (Max _) -> [F.foldl1 (\a b -> toDoc $ ppFun p "max" [a, b])- (fmap (toDoc . ppArg) es)]- (Sum _) -> case Seq.viewl es of- Seq.EmptyL -> [PP.text "0"]- (e' Seq.:< es') -> parens (p > 6) $- F.foldl (\a b -> a ++ (ppNaryOpSum 6 b))- [prettyPrec 6 e']- es'- (Prod _) -> case Seq.viewl es of- Seq.EmptyL -> [PP.text "1"]- (e' Seq.:< es') -> parens (p > 7) $- F.foldl (\a b -> a ++ (ppNaryOpProd 7 b))- [prettyPrec 7 e']- es'+ And -> asOp 3 "&&" es+ Or -> asOp 2 "||" es+ Xor -> asFun "xor" es+ Iff -> asFun "iff" es+ Min _ -> asFun "min" es+ Max _ -> asFun "max" es - where identityElement :: NaryOp a -> Docs- identityElement And = [PP.text "true"]- identityElement Or = [PP.text "false"]- identityElement Xor = [PP.text "false"]- identityElement Iff = [PP.text "true"]+ Sum _ -> case F.toList es of+ [e1] -> prettyPrec p e1+ e1:es' -> parensIf (p > 6) $ sep $+ prettyPrec 6 e1 :+ map ppNaryOpSum es'++ Prod _ -> case F.toList es of+ [e1] -> prettyPrec p e1+ e1:e2:es' -> parensIf (p > 7) $ sep $+ d1' :+ ppNaryOpProd second e2 :+ map (ppNaryOpProd False) es'+ where d1 = prettyPrec 7 e1+ (d1', second) =+ caseVarSyn e1 (const (d1,False)) (\t -> case t of+ -- Use parens to distinguish division into 1+ -- from recip+ Literal_ (LNat 1) -> (parens d1, False)+ Literal_ (LNat _) -> (d1, True)+ _ -> (d1, False))++ where identityElement :: NaryOp a -> Doc+ identityElement And = text "true"+ identityElement Or = text "false"+ identityElement Xor = text "false"+ identityElement Iff = text "true" identityElement (Min _) = error "min cannot be used with no arguments" identityElement (Max _) = error "max cannot be used with no arguments"- identityElement (Sum _) = [PP.text "0"]- identityElement (Prod _) = [PP.text "1"]+ identityElement (Sum _) = text "0"+ identityElement (Prod _) = text "1" + asOp :: (ABT Term abt)+ => Int -> String -> Seq.Seq (abt '[] a) -> Doc+ asOp p0 s = parensIf (p > p0)+ . sepByR s+ . map (prettyPrec (p0 + 1))+ . F.toList++ asFun :: (ABT Term abt)+ => String -> Seq.Seq (abt '[] a) -> Doc+ asFun s = ($ p)+ . F.foldr1 (\a b p' -> ppFun p' s [a, b])+ . fmap (flip prettyPrec)+ Literal_ v -> prettyPrec_ p v- Empty_ _ -> [PP.text "empty"]- Array_ e1 e2 ->- let (vars, _, body) = ppBinder2 e2 in- [ PP.text "array"- <+> toDoc vars- <+> PP.text "of"- <+> toDoc (ppArg e1)- <> PP.colon <> PP.space- , PP.nest 1 (toDoc body)]+ Empty_ typ -> parensIf (p > 5) (text "[]." <+> prettyType 0 typ)+ Array_ e1 e2 -> parensIf (p > 0) $+ let (var, _, body) = ppBinder1 e2 in+ sep [ sep [ text "array" <+> var+ , text "of" <+> pretty e1 <> colon ]+ , body ] - ArrayLiteral_ es -> ppList $ fmap (prettyPrec 0) es+ ArrayLiteral_ es -> ppList $ map pretty es Datum_ d -> prettyPrec_ p (fmap11 LC_ d)- Case_ e1 bs -> parens True $- -- TODO: should we also add hints to the 'Case_' constructor to know whether it came from 'if_', 'unpair', etc?- [ PP.text "match"- <+> (toDoc $ ppArg e1)- <> PP.colon <> PP.space- , PP.nest 1 (PP.vcat (map (toDoc . prettyPrec_ 0) bs))- ]- Superpose_ pes ->- PP.punctuate (PP.text " <|> ") $ L.toList $ fmap ppWeight pes- where ppWeight (w,m)- | (PP.render $ pretty w) == "1" =- toDoc $ ppArg m- | otherwise =- toDoc $ ppFun p "weight" [pretty w, pretty m]+ Case_ e1 [Branch (PDatum h2 _) e2, Branch (PDatum h3 _) e3]+ | "true" <- Text.unpack h2+ , "false" <- Text.unpack h3+ , ([], body2) <- ppBinder e2+ , ([], body3) <- ppBinder e3+ -> parensIf (p > 0) $+ sep [ sep [ text "if" <+> pretty e1 <> colon, nest 2 body2 ]+ , sep [ text "else" <> colon, nest 2 body3 ] ]+ Case_ e1 bs -> parensIf (p > 0) $+ sep [ text "match" <+> pretty e1 <> colon+ , vcat (map (prettyPrec_ 0) bs) ]+ Superpose_ pes -> case L.toList pes of+ [wm] -> ppWeight p wm+ wms -> parensIf (p > 1)+ . sepByR "<|>"+ $ map (ppWeight 2) wms+ where ppWeight p (w,m)+ | Syn (Literal_ (LProb 1)) <- viewABT w+ = prettyPrec p m+ | otherwise+ = ppApply2 p "weight" w m - Reject_ typ -> [PP.text "reject." <+> prettyType 0 typ]+ Reject_ typ -> parensIf (p > 5) (text "reject." <+> prettyType 0 typ) + Bucket lo hi red -> ppFun p "rbucket"+ [ flip prettyPrec lo, flip prettyPrec hi+ , flip prettyPrec_ red ]++instance ABT Term abt => Pretty (Reducer abt xs) where+ prettyPrec_ = flip ppr where+ ppRbinder :: abt xs1 a -> Int -> Doc+ ppRbinder f p =+ let (vs,b) = ppBinder f+ in parensIf (p > 0) $ sep [ sepComma vs <> colon, b ]++ ppr :: Reducer abt xs1 a -> Int -> Doc+ ppr red p =+ case red of+ Red_Fanout l r -> ppFun p "rfanout"+ [ ppr l+ , ppr r ]+ Red_Index s k r -> ppFun p "rindex"+ [ ppRbinder s+ , ppRbinder k+ , ppr r ]+ Red_Split b l r -> ppFun p "rsplit"+ [ ppRbinder b+ , ppr l+ , ppr r ]+ Red_Nop -> text "rnop"+ Red_Add _ k -> ppFun p "radd" [ ppRbinder k ]+ ppNaryOpSum- :: forall abt a- . (ABT Term abt)- => Int- -> abt '[] a- -> Docs-ppNaryOpSum p e =- caseVarSyn e (const $ prefixToTerm "+" e) $ \t ->+ :: forall abt a . (ABT Term abt) => abt '[] a -> Doc+ppNaryOpSum e =+ caseVarSyn e (const d) $ \t -> case t of- Literal_ (LInt i) | i < 0 -> prefixToTerm "-" (syn . Literal_ . LInt . abs $ i)- Literal_ (LReal i) | i < 0 -> prefixToTerm "-" (syn . Literal_ . LReal . abs $ i)- PrimOp_ (Negate _) :$ e1 :* End -> prefixToTerm "-" e1- _ -> prefixToTerm "+" e- where prefixToTerm :: forall a. String -> abt '[] a -> Docs- prefixToTerm s e = [ PP.space <> PP.text s <> PP.space- , prettyPrec p e- ]+ PrimOp_ (Negate _) :$ e1 :* End -> text "-" <+> prettyPrec 7 e1+ _ -> d+ where d = text "+" <+> prettyPrec 7 e ppNaryOpProd- :: forall abt a- . (ABT Term abt)- => Int- -> abt '[] a- -> Docs-ppNaryOpProd p e =- caseVarSyn e (const $ prefixToTerm "*" e) $ \t ->+ :: forall abt a . (ABT Term abt) => Bool -> abt '[] a -> Doc+ppNaryOpProd second e =+ caseVarSyn e (const d) $ \t -> case t of- Literal_ (LProb i) | numerator i == 1 -> - prefixToTerm "/" (syn . Literal_ . LProb . fromIntegral . denominator $ i)- Literal_ (LReal i) | numerator i == 1 -> - prefixToTerm "/" (syn . Literal_ . LReal . fromIntegral . denominator $ i)- PrimOp_ (Recip _) :$ e1 :* End -> prefixToTerm "/" e1- _ -> prefixToTerm "*" e- where prefixToTerm :: forall a. String -> abt '[] a -> Docs- prefixToTerm s e = [ PP.space <> PP.text s <> PP.space- , prettyPrec p e- ]+ PrimOp_ (Recip _) :$ e1 :* End ->+ if not second then d' else+ caseVarSyn e1 (const d') $ \t' ->+ case t' of+ -- Use parens to distinguish division of nats+ -- from prob literal+ Literal_ (LNat _) -> text "/" <+> parens (pretty e1)+ _ -> d'+ where d' = text "/" <+> prettyPrec 8 e1+ _ -> d+ where d = text "*" <+> prettyPrec 8 e -- | Pretty-print @(:$)@ nodes in the AST.-ppSCon :: (ABT Term abt) => Int -> SCon args a -> SArgs abt args -> Docs+ppSCon :: (ABT Term abt) => Int -> SCon args a -> SArgs abt args -> Doc ppSCon p Lam_ = \(e1 :* End) ->- let (vars, types, body) = ppBinder2prec 11 e1 in- parens (p < 11)- [ PP.text "fn" <+> toDoc vars- <+> toDoc types- <> PP.colon <> PP.space- , PP.nest 1 (toDoc body)]+ let (var, typ, body) = ppBinder1 e1 in+ parensIf (p > 0) $+ sep [ text "fn" <+> var <+> typ <> colon+ , body ] --ppSCon p App_ = \(e1 :* e2 :* End) -> ppArg e1 ++ parens True (ppArg e2)-ppSCon _ App_ = \(e1 :* e2 :* End) -> prettyApps e1 e2+ppSCon p App_ = \(e1 :* e2 :* End) -> prettyApps p e1 e2 -ppSCon _ Let_ = \(e1 :* e2 :* End) ->- {-- caseBind e2 $ \x e2' ->- (ppVariable x <+> PP.equals <+> PP.nest n (pretty e1))- : pretty e2'- -}- let (vars, _, body) = ppBinder2 e2 in- [toDoc vars <+> PP.equals <+> toDoc (ppArg e1)- PP.$$ (toDoc body)]+ppSCon p Let_ = \(e1 :* e2 :* End) ->+ -- TODO: generate 'def' if possible+ let (var, _, body) = ppBinder1 e2 in+ parensIf (p > 0) $+ var <+> equals <+> pretty e1 $$ body {- ppSCon p (Ann_ typ) = \(e1 :* End) ->- [toDoc (ppArg e1) <+> PP.text "::" <+> prettyType p typ]+ parensIf (p > 5) (prettyPrec 6 e1 <> text "." <+> prettyType 0 typ) -} ppSCon p (PrimOp_ o) = \es -> ppPrimOp p o es@@ -289,233 +312,227 @@ ppSCon p (CoerceTo_ c) = \(e1 :* End) -> ppCoerceTo p c e1 ppSCon p (UnsafeFrom_ c) = \(e1 :* End) -> ppUnsafeFrom p c e1 ppSCon p (MeasureOp_ o) = \es -> ppMeasureOp p o es-ppSCon _ Dirac = \(e1 :* End) -> [PP.text "return" <+> toDoc (ppArg e1)]-ppSCon _ MBind = \(e1 :* e2 :* End) ->- let (vars, _, body) = ppBinder2 e2 in- [toDoc vars <+> PP.text "<~" <+> toDoc (ppArg e1)- PP.$$ (toDoc body)]+ppSCon p Dirac = \(e1 :* End) ->+ parensIf (p > 0) $+ text "return" <+> pretty e1+ppSCon p MBind = \(e1 :* e2 :* End) ->+ let (var, _, body) = ppBinder1 e2 in+ parensIf (p > 0) $+ var <+> text "<~" <+> pretty e1 $$ body ppSCon p Plate = \(e1 :* e2 :* End) ->- let (vars, types, body) = ppBinder2 e2 in- [ PP.text "plate"- <+> toDoc vars- <+> PP.text "of"- <+> (toDoc $ ppArg e1)- <> PP.colon <> PP.space- , PP.nest 1 (toDoc body)- ]+ let (var, _, body) = ppBinder1 e2 in+ parensIf (p > 0) $+ sep [ sep [ text "plate" <+> var+ , text "of" <+> pretty e1 <> colon ]+ , body ] ppSCon p Chain = \(e1 :* e2 :* e3 :* End) ->- ppFun 11 "chain"- [ toDoc (ppArg e1)- , toDoc (ppArg e2) <+> PP.char '$'- , toDoc $ ppBinder e2- ]+ let (var, _, body) = ppBinder1 e3 in+ parensIf (p > 0) $+ sep [ sep [ text "chain" <+> var+ , text "from" <+> pretty e2+ , text "of" <+> pretty e1 <> colon ]+ , body ] ppSCon p Integrate = \(e1 :* e2 :* e3 :* End) ->- let (vars, types, body) = ppBinder2 e3 in- [ PP.text "integrate"- <+> toDoc vars- <+> PP.text "from"- <+> (toDoc $ ppArg e1)- <+> PP.text "to"- <+> (toDoc $ ppArg e2)- <> PP.colon <> PP.space- , PP.nest 1 (toDoc body)- ]+ let (var, _, body) = ppBinder1 e3 in+ parensIf (p > 0) $+ sep [ sep [ text "integrate" <+> var+ , text "from" <+> pretty e1+ , text "to" <+> pretty e2 <> colon ]+ , body ] ppSCon p (Summate _ _) = \(e1 :* e2 :* e3 :* End) ->- let (vars, types, body) = ppBinder2 e3 in- parens True $- [ PP.text "summate"- <+> toDoc vars- <+> PP.text "from"- <+> (toDoc $ ppArg e1)- <+> PP.text "to"- <+> (toDoc $ ppArg e2)- <> PP.colon <> PP.space- , PP.nest 1 (toDoc body)- ]+ let (var, _, body) = ppBinder1 e3 in+ parensIf (p > 0) $+ sep [ sep [ text "summate" <+> var+ , text "from" <+> pretty e1+ , text "to" <+> pretty e2 <> colon ]+ , body ] ppSCon p (Product _ _) = \(e1 :* e2 :* e3 :* End) ->- let (vars, types, body) = ppBinder2 e3 in- parens True $- [ PP.text "product"- <+> toDoc vars- <+> PP.text "from"- <+> (toDoc $ ppArg e1)- <+> PP.text "to"- <+> (toDoc $ ppArg e2)- <> PP.colon <> PP.space- , PP.nest 1 (toDoc body)- ]--ppSCon p Expect = \(e1 :* e2 :* End) ->- let (vars, types, body) = ppBinder2 e2 in- [ PP.text "expect"- <+> toDoc vars- <+> (toDoc . parens True $ ppArg e1)- <> PP.colon- , PP.nest 1 (toDoc body)- ]+ let (var, _, body) = ppBinder1 e3 in+ parensIf (p > 0) $+ sep [ sep [ text "product" <+> var+ , text "from" <+> pretty e1+ , text "to" <+> pretty e2 <> colon ]+ , body ] -ppSCon p Observe = \(e1 :* e2 :* End) ->- [ PP.text "observe"- <+> (toDoc $ ppArg e1)- <+> (toDoc $ ppArg e2)- ]+ppSCon p (Transform_ t) = ppTransform p t +ppTransform :: (ABT Term abt)+ => Int -> Transform args a+ -> SArgs abt args -> Doc+ppTransform p t es =+ case t of+ Expect ->+ case es of+ e1 :* e2 :* End ->+ let (var, _, body) = ppBinder1 e2 in+ parensIf (p > 0) $+ sep [ text "expect" <+> var <+> pretty e1 <> colon+ , body ]+ _ -> ppApply p (transformName t) es -ppCoerceTo :: ABT Term abt => Int -> Coercion a b -> abt '[] a -> Docs-ppCoerceTo =+ppCoerceTo :: ABT Term abt => Int -> Coercion a b -> abt '[] a -> Doc+ppCoerceTo p c = ppApply1 p f -- BUG: this may not work quite right when the coercion isn't one of the special named ones...- \p c e -> ppFun p (prettyShow c) [toDoc $ ppArg e] where- prettyShow (CCons (Signed HRing_Real) CNil) = "prob2real"- prettyShow (CCons (Signed HRing_Int) CNil) = "nat2int"- prettyShow (CCons (Continuous HContinuous_Real) CNil) = "int2real"- prettyShow (CCons (Continuous HContinuous_Prob) CNil) = "nat2prob"- prettyShow (CCons (Continuous HContinuous_Prob)- (CCons (Signed HRing_Real) CNil)) = "nat2real"- prettyShow (CCons (Signed HRing_Int)- (CCons (Continuous HContinuous_Real) CNil)) = "nat2real"- prettyShow c = "coerceTo_ " ++ showsPrec 11 c ""+ f = case c of+ Signed HRing_Real `CCons` CNil -> "prob2real"+ Signed HRing_Int `CCons` CNil -> "nat2int"+ Continuous HContinuous_Real `CCons` CNil -> "int2real"+ Continuous HContinuous_Prob `CCons` CNil -> "nat2prob"+ Continuous HContinuous_Prob `CCons`+ Signed HRing_Real `CCons` CNil -> "nat2real"+ Signed HRing_Int `CCons`+ Continuous HContinuous_Real `CCons` CNil -> "nat2real"+ _ -> "coerceTo_ (" ++ show c ++ ")" -ppUnsafeFrom :: ABT Term abt => Int -> Coercion a b -> abt '[] b -> Docs-ppUnsafeFrom =+ppUnsafeFrom :: ABT Term abt => Int -> Coercion a b -> abt '[] b -> Doc+ppUnsafeFrom p c = ppApply1 p f -- BUG: this may not work quite right when the coercion isn't one of the special named ones...- \p c e -> ppFun p (prettyShow c) [toDoc $ ppArg e] where- prettyShow (CCons (Signed HRing_Real) CNil) = "real2prob"- prettyShow (CCons (Signed HRing_Int) CNil) = "int2nat"- prettyShow c = "unsafeFrom_ " ++ showsPrec 11 c ""+ f = case c of+ Signed HRing_Real `CCons` CNil -> "real2prob"+ Signed HRing_Int `CCons` CNil -> "int2nat"+ _ -> "unsafeFrom_ (" ++ show c ++ ")" -- | Pretty-print a type. prettyType :: Int -> Sing (a :: Hakaru) -> Doc-prettyType _ SNat = PP.text "nat"-prettyType _ SInt = PP.text "int"-prettyType _ SProb = PP.text "prob"-prettyType _ SReal = PP.text "real"-prettyType p (SMeasure a) = PP.text "measure" <> PP.parens (prettyType p a)-prettyType p (SArray a) = PP.text "array" <> PP.parens (prettyType p a)--- HACK: precedence of function types-prettyType p (SFun a b) = PP.parens (prettyType p a <+> PP.text "->" <+> prettyType p b)-prettyType p typ =- case typ of- SData (STyCon sym `STyApp` a `STyApp` b) _- | Just Refl <- jmEq1 sym sSymbol_Pair- -> toDoc $ ppFun p "pair" [prettyType p a, prettyType p b]- | Just Refl <- jmEq1 sym sSymbol_Either- -> toDoc $ ppFun p "either" [prettyType p a, prettyType p b]- SData (STyCon sym `STyApp` a) _- | Just Refl <- jmEq1 sym sSymbol_Maybe- -> toDoc $ ppFun p "maybe" [prettyType p a]- SData (STyCon sym) _- | Just Refl <- jmEq1 sym sSymbol_Bool- -> PP.text "bool"- | Just Refl <- jmEq1 sym sSymbol_Unit- -> PP.text "unit"- _ -> PP.text (showsPrec 11 typ "")+prettyType _ SNat = text "nat"+prettyType _ SInt = text "int"+prettyType _ SProb = text "prob"+prettyType _ SReal = text "real"+prettyType p (SFun a b) = parensIf (p > 0)+ $ sep [ prettyType 1 a <+> text "->"+ , prettyType 0 b ]+prettyType p (SMeasure a) = ppFun p "measure" [flip prettyType a]+prettyType p (SArray a) = ppFun p "array" [flip prettyType a]+prettyType p (SData (STyCon sym `STyApp` a `STyApp` b) _)+ | Just Refl <- jmEq1 sym sSymbol_Pair+ = ppFun p "pair" [flip prettyType a, flip prettyType b]+ | Just Refl <- jmEq1 sym sSymbol_Either+ = ppFun p "either" [flip prettyType a, flip prettyType b]+prettyType p (SData (STyCon sym `STyApp` a) _)+ | Just Refl <- jmEq1 sym sSymbol_Maybe+ = ppFun p "maybe" [flip prettyType a]+prettyType p (SData (STyCon sym) _)+ | Just Refl <- jmEq1 sym sSymbol_Bool+ = text "bool"+ | Just Refl <- jmEq1 sym sSymbol_Unit+ = text "unit"+prettyType _ typ+ = parens (text (show typ)) -- | Pretty-print a 'PrimOp' @(:$)@ node in the AST. ppPrimOp :: (ABT Term abt, typs ~ UnLCs args, args ~ LCs typs)- => Int -> PrimOp typs a -> SArgs abt args -> Docs-ppPrimOp p Not = \(e1 :* End) -> ppApply1 p "not" e1-ppPrimOp p Impl = \(e1 :* e2 :* End) ->- -- TODO: make prettier- ppFun p "syn"- [ toDoc $ ppFun 11 "Impl"- [ toDoc $ ppArg e1- , toDoc $ ppArg e2- ]]-ppPrimOp p Diff = \(e1 :* e2 :* End) ->- -- TODO: make prettier- ppFun p "syn"- [ toDoc $ ppFun 11 "Diff"- [ toDoc $ ppArg e1- , toDoc $ ppArg e2- ]]-ppPrimOp p Nand = \(e1 :* e2 :* End) -> ppApply2 p "nand" e1 e2 -- TODO: make infix...-ppPrimOp p Nor = \(e1 :* e2 :* End) -> ppApply2 p "nor" e1 e2 -- TODO: make infix...-ppPrimOp _ Pi = \End -> [PP.text "pi"]-ppPrimOp p Sin = \(e1 :* End) -> ppApply1 p "sin" e1-ppPrimOp p Cos = \(e1 :* End) -> ppApply1 p "cos" e1-ppPrimOp p Tan = \(e1 :* End) -> ppApply1 p "tan" e1-ppPrimOp p Asin = \(e1 :* End) -> ppApply1 p "asin" e1-ppPrimOp p Acos = \(e1 :* End) -> ppApply1 p "acos" e1-ppPrimOp p Atan = \(e1 :* End) -> ppApply1 p "atan" e1-ppPrimOp p Sinh = \(e1 :* End) -> ppApply1 p "sinh" e1-ppPrimOp p Cosh = \(e1 :* End) -> ppApply1 p "cosh" e1-ppPrimOp p Tanh = \(e1 :* End) -> ppApply1 p "tanh" e1-ppPrimOp p Asinh = \(e1 :* End) -> ppApply1 p "asinh" e1-ppPrimOp p Acosh = \(e1 :* End) -> ppApply1 p "acosh" e1-ppPrimOp p Atanh = \(e1 :* End) -> ppApply1 p "atanh" e1-ppPrimOp p RealPow = \(e1 :* e2 :* End) -> ppBinop "**" 8 RightAssoc p e1 e2-ppPrimOp p Exp = \(e1 :* End) -> ppApply1 p "exp" e1-ppPrimOp p Log = \(e1 :* End) -> ppApply1 p "log" e1-ppPrimOp _ (Infinity _) = \End -> [PP.text "∞"]-ppPrimOp p GammaFunc = \(e1 :* End) -> ppApply1 p "gammaFunc" e1-ppPrimOp p BetaFunc = \(e1 :* e2 :* End) -> ppApply2 p "betaFunc" e1 e2+ => Int -> PrimOp typs a -> SArgs abt args -> Doc+ppPrimOp p Not (e1 :* End)+ | Syn (PrimOp_ Less{} :$ e2 :* e3 :* End) <- viewABT e1+ = ppBinop "<=" 4 NonAssoc p e3 e2+ | Syn (PrimOp_ Equal{} :$ e2 :* e3 :* End) <- viewABT e1+ = ppBinop "/=" 4 NonAssoc p e2 e3+ | otherwise+ = ppApply1 p "not" e1+ppPrimOp p Impl (e1 :* e2 :* End) = ppApply2 p "impl" e1 e2+ppPrimOp p Diff (e1 :* e2 :* End) = ppApply2 p "diff" e1 e2+ppPrimOp p Nand (e1 :* e2 :* End) = ppApply2 p "nand" e1 e2+ppPrimOp p Nor (e1 :* e2 :* End) = ppApply2 p "nor" e1 e2+ppPrimOp _ Pi End = text "pi"+ppPrimOp p Sin (e1 :* End) = ppApply1 p "sin" e1+ppPrimOp p Cos (e1 :* End) = ppApply1 p "cos" e1+ppPrimOp p Tan (e1 :* End) = ppApply1 p "tan" e1+ppPrimOp p Asin (e1 :* End) = ppApply1 p "asin" e1+ppPrimOp p Acos (e1 :* End) = ppApply1 p "acos" e1+ppPrimOp p Atan (e1 :* End) = ppApply1 p "atan" e1+ppPrimOp p Sinh (e1 :* End) = ppApply1 p "sinh" e1+ppPrimOp p Cosh (e1 :* End) = ppApply1 p "cosh" e1+ppPrimOp p Tanh (e1 :* End) = ppApply1 p "tanh" e1+ppPrimOp p Asinh (e1 :* End) = ppApply1 p "asinh" e1+ppPrimOp p Acosh (e1 :* End) = ppApply1 p "acosh" e1+ppPrimOp p Atanh (e1 :* End) = ppApply1 p "atanh" e1+ppPrimOp p RealPow (e1 :* e2 :* End) = ppBinop "**" 8 RightAssoc p e1 e2+ppPrimOp p Choose (e1 :* e2 :* End) = ppApply2 p "choose" e1 e2+ppPrimOp p Exp (e1 :* End) = ppApply1 p "exp" e1+ppPrimOp p Log (e1 :* End) = ppApply1 p "log" e1+ppPrimOp _ (Infinity _) End = text "∞"+ppPrimOp p GammaFunc (e1 :* End) = ppApply1 p "gammaFunc" e1+ppPrimOp p BetaFunc (e1 :* e2 :* End) = ppApply2 p "betaFunc" e1 e2+ppPrimOp p (Equal _) (e1 :* e2 :* End) = ppBinop "==" 4 NonAssoc p e1 e2+ppPrimOp p (Less _) (e1 :* e2 :* End) = ppBinop "<" 4 NonAssoc p e1 e2+ppPrimOp p (NatPow _) (e1 :* e2 :* End) = ppBinop "^" 8 RightAssoc p e1 e2+ppPrimOp p (Negate _) (e1 :* End) = ppNegate p e1+ppPrimOp p (Abs _) (e1 :* End) = ppApply1 p "abs" e1+ppPrimOp p (Signum _) (e1 :* End) = ppApply1 p "signum" e1+ppPrimOp p (Recip _) (e1 :* End) = ppRecip p e1+ppPrimOp p (NatRoot _) (e1 :* e2 :* End) = ppNatRoot p e1 e2+ppPrimOp p (Erf _) (e1 :* End) = ppApply1 p "erf" e1+ppPrimOp p Floor (e1 :* End) = ppApply1 p "floor" e1 -ppPrimOp p (Equal _) = \(e1 :* e2 :* End) -> ppBinop "==" 4 NonAssoc p e1 e2-ppPrimOp p (Less _) = \(e1 :* e2 :* End) -> ppBinop "<" 4 NonAssoc p e1 e2-ppPrimOp p (NatPow _) = \(e1 :* e2 :* End) -> ppBinop "^" 8 RightAssoc p e1 e2-ppPrimOp p (Negate _) = \(e1 :* End) -> ppApply1 p "negate" e1-ppPrimOp p (Abs _) = \(e1 :* End) -> ppApply1 p "abs" e1-ppPrimOp p (Signum _) = \(e1 :* End) -> ppApply1 p "signum" e1-ppPrimOp p (Recip _) = \(e1 :* End) -> ppApply1 p "recip" e1-ppPrimOp p (NatRoot _) = \(e1 :* e2 :* End) -> ppNatRoot p e1 e2-ppPrimOp p (Erf _) = \(e1 :* End) -> ppApply1 p "erf" e1+ppNegate :: (ABT Term abt) => Int -> abt '[] a -> Doc+ppNegate p e = parensIf (p > 6) $+ caseVarSyn e (const d) $ \t ->+ case t of+ -- Use parens to distinguish between negation of nats/probs+ -- from int/real literal+ Literal_ (LNat _) -> d'+ Literal_ (LProb _) -> d'+ _ -> d+ where d = text "-" <> prettyPrec 7 e+ d' = text "-" <> parens (pretty e) +ppRecip :: (ABT Term abt) => Int -> abt '[] a -> Doc+ppRecip p e = parensIf (p > 7) $+ caseVarSyn e (const d) $ \t ->+ case t of+ -- Use parens to distinguish between reciprocal of nat+ -- from prob literal+ Literal_ (LNat _) -> d'+ _ -> d+ where d = text "1/" <+> prettyPrec 8 e+ d' = text "1/" <+> parens (pretty e) ppNatRoot :: (ABT Term abt) => Int -> abt '[] a -> abt '[] 'HNat- -> Docs+ -> Doc ppNatRoot p e1 e2 =- caseVarSyn e2 (\x -> ppApply2 p "natroot" e1 e2) $ \t ->+ caseVarSyn e2 (const d) $ \t -> case t of- Literal_ (LNat 2) -> ppApply1 p "sqrt" e1- _ -> ppApply2 p "natroot" e1 e2+ Literal_ (LNat 2) -> ppApply1 p "sqrt" e1+ _ -> d+ where d = ppApply2 p "natroot" e1 e2 -- | Pretty-print a 'ArrayOp' @(:$)@ node in the AST. ppArrayOp :: (ABT Term abt, typs ~ UnLCs args, args ~ LCs typs)- => Int -> ArrayOp typs a -> SArgs abt args -> Docs-ppArrayOp p (Index _) = \(e1 :* e2 :* End) ->- [(toDoc $ parensIf (isArray e1) $ ppArg e1) <>- PP.text "[" <>- (toDoc $ ppArg e2) <>- PP.text "]"]- where isArray e = caseVarSyn e (const False) $ \t ->- case t of- Array_ _ _ -> True- _ -> False- parensIf True e = parens True e- parensIf False e = e+ => Int -> ArrayOp typs a -> SArgs abt args -> Doc+ppArrayOp p (Index _) = \(e1 :* e2 :* End) -> parensIf (p > 10)+ $ cat [ prettyPrec 10 e1, nest 2 (brackets (pretty e2)) ] ppArrayOp p (Size _) = \(e1 :* End) -> ppApply1 p "size" e1 ppArrayOp p (Reduce _) = \(e1 :* e2 :* e3 :* End) -> ppFun p "reduce"- [ toDoc $ ppArg e1 -- N.B., @e1@ uses lambdas rather than being a binding form!- , toDoc $ ppArg e2- , toDoc $ ppArg e3- ]+ [ flip prettyPrec e1+ , flip prettyPrec e2+ , flip prettyPrec e3 ] -- | Pretty-print a 'MeasureOp' @(:$)@ node in the AST. ppMeasureOp :: (ABT Term abt, typs ~ UnLCs args, args ~ LCs typs)- => Int -> MeasureOp typs a -> SArgs abt args -> Docs-ppMeasureOp _ Lebesgue = \End -> [PP.text "lebesgue"]-ppMeasureOp _ Counting = \End -> [PP.text "counting"]+ => Int -> MeasureOp typs a -> SArgs abt args -> Doc+ppMeasureOp p Lebesgue = \(e1 :* e2 :* End) -> ppApply2 p "lebesgue" e1 e2+ppMeasureOp _ Counting = \End -> text "counting" ppMeasureOp p Categorical = \(e1 :* End) -> ppApply1 p "categorical" e1 ppMeasureOp p Uniform = \(e1 :* e2 :* End) -> ppApply2 p "uniform" e1 e2 ppMeasureOp p Normal = \(e1 :* e2 :* End) -> ppApply2 p "normal" e1 e2@@ -523,28 +540,36 @@ ppMeasureOp p Gamma = \(e1 :* e2 :* End) -> ppApply2 p "gamma" e1 e2 ppMeasureOp p Beta = \(e1 :* e2 :* End) -> ppApply2 p "beta" e1 e2 --- BUG: doubles may not properly and unambiguously represent the correct rational! Consider using 'ppRatio' instead. instance Pretty Literal where- prettyPrec_ _ (LNat n) = [PP.integer (fromNatural n)]- prettyPrec_ _ (LInt i) = [PP.integer i]- prettyPrec_ p (LProb l) =- [ppRatio p $ fromNonNegativeRational l]- prettyPrec_ p (LReal r) = [ppRatio p r]+ prettyPrec_ _ (LNat n) = integer (fromNatural n)+ prettyPrec_ p (LInt i) = parensIf (p > 6) $+ if i < 0 then text "-" <> integer (-i)+ else text "+" <> integer i+ prettyPrec_ p (LProb l) = parensIf (p > 7) $+ cat [ integer n, text "/" <> integer d ]+ where r = fromNonNegativeRational l+ n = numerator r+ d = denominator r+ prettyPrec_ p (LReal r) = parensIf (p > 6) $+ if n < 0 then text "-" <> cat [ integer (-n), text "/" <> integer d ]+ else text "+" <> cat [ integer n , text "/" <> integer d ]+ where n = numerator r+ d = denominator r instance Pretty Value where- prettyPrec_ _ (VNat n) = [PP.int (fromNat n)]- prettyPrec_ _ (VInt i) = [PP.int i]- prettyPrec_ _ (VProb l) =- [PP.double $ LF.fromLogFloat l]- prettyPrec_ _ (VReal r) = [PP.double r]+ prettyPrec_ _ (VNat n) = integer (fromNatural n)+ prettyPrec_ p (VInt i) = parensIf (p > 6) $+ if i < 0 then integer i else text "+" <> integer i+ prettyPrec_ _ (VProb l) = double (LF.fromLogFloat l)+ prettyPrec_ p (VReal r) = parensIf (p > 6) $+ if r < 0 then double r else text "+" <> double r prettyPrec_ p (VDatum d) = prettyPrec_ p d- prettyPrec_ _ (VLam _) = [PP.text "<function>"]- prettyPrec_ _ (VMeasure _) = [PP.text "<measure>"]- prettyPrec_ p (VArray a) =- ppList . V.toList $ V.map (toDoc . prettyPrec_ p) a+ prettyPrec_ _ (VLam _) = text "<function>"+ prettyPrec_ _ (VMeasure _) = text "<measure>"+ prettyPrec_ _ (VArray a) = ppList . V.toList $ V.map (prettyPrec_ 0) a prettyValue :: Value a -> Doc-prettyValue = toDoc . prettyPrec_ 0+prettyValue = prettyPrec_ 0 instance Pretty f => Pretty (Datum f) where prettyPrec_ p (Datum hint _typ d)@@ -554,73 +579,66 @@ | otherwise = case Text.unpack hint of -- Special cases for certain datums- "pair" -> ppFun p ""- (foldMap11 ((:[]) . toDoc . prettyPrec_ 11) d) - "true" -> [PP.text "true"]- "false" -> [PP.text "false"]- "unit" -> [PP.text "()"]+ "pair" -> ppTuple p (foldMap11 (\e -> [flip prettyPrec_ e]) d) + "true" -> text "true"+ "false" -> text "false"+ "unit" -> text "()" -- General case- _ -> ppFun p (Text.unpack hint)- (foldMap11 ((:[]) . toDoc . prettyPrec_ 11) d)- ++ [PP.text "." <+> prettyType p _typ]+ f -> parensIf (p > 5) $+ ppFun 6 f (foldMap11 (\e -> [flip prettyPrec_ e]) d)+ <> text "." <+> prettyType 0 _typ -- HACK: need to pull this out in order to get polymorphic recursion over @xs@-ppPattern :: Int -> [Doc] -> Pattern xs a -> (Docs, [Doc])-ppPattern _ _ PWild = ([PP.text "_"], [])-ppPattern _ (v:vs) PVar = ([v], vs)-ppPattern p vars (PDatum hint d0)+ppPattern :: [Doc] -> Pattern xs a -> (Int -> Doc, [Doc])+ppPattern vars PWild = (const (text "_"), vars)+ppPattern (v:vs) PVar = (const v , vs)+ppPattern vars (PDatum hint d0) | Text.null hint = error "TODO: prettyPrec_@Pattern" | otherwise = case Text.unpack hint of -- Special cases for certain pDatums- "true" -> ([PP.text "true"], vars)- "false" -> ([PP.text "false"], vars)- "pair" -> ppFunWithVars p Text.empty+ "true" -> (const (text "true" ), vars)+ "false" -> (const (text "false"), vars)+ "pair" -> ppFunWithVars ppTuple -- General case- _ -> ppFunWithVars p hint+ f -> ppFunWithVars (flip ppFun f) where- ppFunWithVars p hint = (ppFun p (Text.unpack hint) g, vars')+ ppFunWithVars ppHint = (flip ppHint g, vars') where (g, vars') = goCode d0 vars - goCode :: PDatumCode xss vars a -> [Doc] -> (Docs, [Doc])+ goCode :: PDatumCode xss vars a -> [Doc] -> ([Int -> Doc], [Doc]) goCode (PInr d) = goCode d goCode (PInl d) = goStruct d - goStruct :: PDatumStruct xs vars a -> [Doc] -> (Docs, [Doc])+ goStruct :: PDatumStruct xs vars a -> [Doc] -> ([Int -> Doc], [Doc]) goStruct PDone vars = ([], vars) goStruct (PEt d1 d2) vars = (gF ++ gS, vars'') where (gF, vars') = goFun d1 vars (gS, vars'') = goStruct d2 vars' - goFun :: PDatumFun x vars a -> [Doc] -> (Docs, [Doc])- goFun (PKonst d) vars = ([toDoc $ fst r], snd r)- where r = ppPattern 11 vars d- goFun (PIdent d) vars = ([toDoc $ fst r], snd r)- where r = ppPattern 11 vars d+ goFun :: PDatumFun x vars a -> [Doc] -> ([Int -> Doc], [Doc])+ goFun (PKonst d) vars = ([g], vars')+ where (g, vars') = ppPattern vars d+ goFun (PIdent d) vars = ([g], vars')+ where (g, vars') = ppPattern vars d instance (ABT Term abt) => Pretty (Branch a abt) where- -- BUG: we can't actually use the HOAS API here, since we- -- aren't using a Prelude-defined @branch@...- -- HACK: don't *always* print parens; pass down the precedence to- -- 'ppBinder' to have them decide if they need to or not. prettyPrec_ p (Branch pat e) =- let (vars, _, body) = ppBinder2 e in- [ (toDoc . fst $ ppPattern 11 vars pat) <> PP.colon <> PP.space- , PP.nest 1 $ toDoc $ body- ]+ let (vars, body) = ppBinder e+ (pp, []) = ppPattern vars pat+ in sep [ pp 0 <> colon, nest 2 body ] -----------------------------------------------------------------type DList a = [a] -> [a]--prettyApps :: (ABT Term abt) => abt '[] (a ':-> b) -> abt '[] a -> Docs-prettyApps = \ e1 e2 ->+prettyApps :: (ABT Term abt) => Int -> abt '[] (a ':-> b) -> abt '[] a -> Doc+prettyApps = \ p e1 e2 ->+{- TODO: confirm not using reduceLams case reduceLams e1 e2 of Just e2' -> ppArg e2' Nothing ->- let (d, vars) = collectApps e1 (pretty e2 :) in- [d <> ppTuple (vars [])]+-}+ uncurry (ppApp p) (collectApps e1 [flip prettyPrec e2]) where reduceLams :: (ABT Term abt)@@ -633,79 +651,56 @@ Just (subst x e2 e1') _ -> Nothing + -- collectApps makes sure f(x,y) is not printed f(x)(y) collectApps :: (ABT Term abt)- => abt '[] (a ':-> b) -> DList Doc -> (Doc, DList Doc)+ => abt '[] (a ':-> b) -> [Int -> Doc] -> (Int -> Doc, [Int -> Doc]) collectApps e es = - caseVarSyn e (\x -> (ppVariable x, es)) $ \t ->+ caseVarSyn e (const ret) $ \t -> case t of- App_ :$ e1 :* e2 :* End -> collectApps e1 ((pretty e2 :) . es)- _ -> (pretty e, es)+ App_ :$ e1 :* e2 :* End -> collectApps e1 (flip prettyPrec e2 : es)+ _ -> ret+ where ret = (flip prettyPrec e, es) -prettyLams :: (ABT Term abt) => abt '[a] b -> Doc-prettyLams = \e ->- let (d, vars) = collectLams e id in- PP.char '\\' <+> PP.sep (vars []) <+> PP.text "->" <+> d- where- collectLams- :: (ABT Term abt)- => abt '[a] b -> DList Doc -> (Doc, DList Doc)- collectLams e xs = - caseBind e $ \x e' ->- let xs' = xs . (ppVariable x :) in- caseVarSyn e' (\y -> (ppVariable y, xs')) $ \t ->- case t of- Lam_ :$ e1 :* End -> collectLams e1 xs'- _ -> (pretty e', xs') ---- | For the \"@lam $ \x ->\n@\" style layout.-adjustHead :: (Doc -> Doc) -> Docs -> Docs-adjustHead f [] = [f (toDoc [])]-adjustHead f (d:ds) = f d : ds--parens :: Bool -> Docs -> Docs-parens True ds = [PP.parens (PP.nest 1 (toDoc ds))]-parens False ds = [PP.parens (toDoc ds)]+ppList :: [Doc] -> Doc+ppList = brackets . sepComma -ppList :: [Doc] -> Docs-ppList = (:[]) . PP.brackets . PP.nest 1 . PP.fsep . PP.punctuate PP.comma+ppTuple :: Int -> [Int -> Doc] -> Doc+ppTuple _ = parens . sepComma . map ($ 0) -ppTuple :: [Doc] -> Doc-ppTuple = PP.parens . PP.sep . PP.punctuate PP.comma+ppApp :: Int -> (Int -> Doc) -> [Int -> Doc] -> Doc+ppApp p f ds = parensIf (p > 10)+ $ cat [ f 10, nest 2 (ppTuple 11 ds) ] --- TODO: why does this take the precedence argument if it doesn't care?-ppFun :: Int -> String -> [Doc] -> Docs-ppFun _ f [] = [PP.text f <> PP.text "()"]-ppFun _ f ds = [PP.text f <> ppTuple ds]+ppFun :: Int -> String -> [Int -> Doc] -> Doc+ppFun p = ppApp p . const . text -ppArg :: (ABT Term abt) => abt '[] a -> Docs-ppArg = prettyPrec_ 11 . LC_+ppApply1 :: (ABT Term abt) => Int -> String -> abt '[] a -> Doc+ppApply1 p f e1 = ppFun p f [flip prettyPrec e1] -ppApply1 :: (ABT Term abt) => Int -> String -> abt '[] a -> Docs-ppApply1 p f e1 = ppFun p f [toDoc $ ppArg e1]+ppApply2 :: (ABT Term abt) => Int -> String -> abt '[] a -> abt '[] b -> Doc+ppApply2 p f e1 e2 = ppFun p f [flip prettyPrec e1, flip prettyPrec e2] -ppApply2- :: (ABT Term abt) => Int -> String -> abt '[] a -> abt '[] b -> Docs-ppApply2 p f e1 e2 = ppFun p f [toDoc $ ppArg e1, toDoc $ ppArg e2]+ppApply :: ABT Term abt => Int -> String+ -> SArgs abt xs -> Doc+ppApply p f es =+ ppFun p f $ foldMap21 (pure . const . ppBinderAsFun) es ppBinop :: (ABT Term abt) => String -> Int -> Associativity- -> Int -> abt '[] a -> abt '[] b -> Docs+ -> Int -> abt '[] a -> abt '[] b -> Doc ppBinop op p0 assoc =- let (p1,p2) =+ let (p1,p2,f1,f2) = case assoc of- LeftAssoc -> (p0, 1 + p0)- RightAssoc -> (1 + p0, p0)- NonAssoc -> (1 + p0, 1 + p0)+ NonAssoc -> (1 + p0, 1 + p0, id, (text op <+>))+ LeftAssoc -> ( p0, 1 + p0, id, (text op <+>))+ RightAssoc -> (1 + p0, p0, (<+> text op), id) in \p e1 e2 ->- parens (p > p0)- [ prettyPrec p1 e1- , PP.space <> PP.text op <> PP.space- , prettyPrec p2 e2- ]+ parensIf (p > p0) $ sep [ f1 (prettyPrec p1 e1)+ , f2 (prettyPrec p2 e2) ] ---------------------------------------------------------------- ----------------------------------------------------------- fin.
haskell/Language/Hakaru/Pretty/Haskell.hs view
@@ -1,8 +1,10 @@ {-# LANGUAGE GADTs+ , OverloadedStrings , KindSignatures , DataKinds , FlexibleContexts , UndecidableInstances+ , LambdaCase #-} {-# OPTIONS_GHC -Wall -fwarn-tabs #-}@@ -22,9 +24,11 @@ ( -- * The user-facing API pretty+ , prettyString , prettyPrec , prettyAssoc , prettyPrecAssoc+ , prettyType -- * Helper functions (semi-public internal API) , ppVariable@@ -44,13 +48,16 @@ import qualified Data.List.NonEmpty as L import qualified Data.Text as Text import qualified Data.Sequence as Seq -- Because older versions of "Data.Foldable" do not export 'null' apparently...+import Prelude hiding ((<>)) import Data.Number.Nat (fromNat) import Data.Number.Natural (fromNatural)-import Language.Hakaru.Syntax.IClasses (fmap11, foldMap11, List1(..))+import Language.Hakaru.Syntax.IClasses (fmap11, foldMap11, List1(..)+ ,Foldable21(..)) import Language.Hakaru.Types.DataKind import Language.Hakaru.Types.Coercion import Language.Hakaru.Types.HClasses+import Language.Hakaru.Types.Sing import Language.Hakaru.Syntax.AST import Language.Hakaru.Syntax.Datum import Language.Hakaru.Syntax.Reducer@@ -62,6 +69,23 @@ pretty = prettyPrec 0 +prettyString :: (ABT Term abt)+ => Sing a+ -> abt '[] a+ -> Doc+prettyString typ ast =+ PP.text $ Text.unpack (Text.unlines $ header ++ [ Text.pack (prettyProg "prog" typ ast)])++prettyProg :: (ABT Term abt)+ => String+ -> Sing a+ -> abt '[] a+ -> String+prettyProg name typ ast =+ PP.renderStyle PP.style+ ( PP.sep [PP.text (name ++ " ::"), PP.nest 2 (prettyType typ)]+ PP.$+$ PP.sep [PP.text (name ++ " =") , PP.nest 2 (pretty ast)] )+ -- | Pretty-print a term at a given precendence level. prettyPrec :: (ABT Term abt) => Int -> abt '[] a -> Doc prettyPrec p = toDoc . prettyPrec_ p . LC_@@ -80,12 +104,41 @@ , prettyPrec 11 e ] ++-- | Pretty-print a Hakaru type as a Haskell type.+prettyType :: Sing (a :: Hakaru) -> Doc+prettyType SInt = PP.text "Int"+prettyType SNat = PP.text "Int"+prettyType SReal = PP.text "Double"+prettyType SProb = PP.text "Prob"+prettyType (SArray t) =+ let t' = PP.nest 2 (prettyType t) in+ PP.parens (PP.sep [PP.text "MayBoxVec", t', t'])+prettyType (SMeasure t) =+ PP.parens (PP.sep [PP.text "Measure", PP.nest 2 (prettyType t)])+prettyType (SFun t1 t2) =+ PP.parens (PP.sep [prettyType t1 <+> PP.text "->", prettyType t2])+prettyType (SData _ (SDone `SPlus` SVoid)) =+ PP.text "()"+prettyType (SData _ (SDone `SPlus` SDone `SPlus` SVoid)) =+ PP.text "Bool"+prettyType (SData _ (SDone `SPlus` (SKonst t `SEt` SDone) `SPlus` SVoid)) =+ PP.parens (PP.sep [PP.text "Maybe", PP.nest 2 (prettyType t)])+prettyType (SData _ ((SKonst t1 `SEt` SDone) `SPlus`+ (SKonst t2 `SEt` SDone) `SPlus` SVoid)) =+ PP.parens (PP.sep [PP.text "Either", PP.nest 2 (prettyType t1),+ PP.nest 2 (prettyType t2)])+prettyType (SData _ ((SKonst t1 `SEt` SKonst t2 `SEt` SDone) `SPlus` SVoid)) =+ PP.parens (PP.sep [prettyType t1 <> PP.comma, prettyType t2])+prettyType s = error ("TODO: prettyType: " ++ show s)++ ---------------------------------------------------------------- class Pretty (f :: Hakaru -> *) where -- | A polymorphic variant if 'prettyPrec', for internal use. prettyPrec_ :: Int -> f a -> Docs -type Docs = [Doc] +type Docs = [Doc] -- So far as I can tell from the documentation, if the input is a singleton list then the result is the same as that singleton. toDoc :: Docs -> Doc@@ -143,7 +196,7 @@ -- BUG: since switching to ABT2, this instance requires -XUndecidableInstances; must be fixed! instance (ABT Term abt) => Pretty (LC_ abt) where prettyPrec_ p (LC_ e) =- caseVarSyn e ((:[]) . ppVariable) $ \t -> + caseVarSyn e ((:[]) . ppVariable) $ \t -> case t of o :$ es -> ppSCon p o es NaryOp_ o es ->@@ -192,13 +245,13 @@ [ ppArg e1 , toDoc $ ppList (map (toDoc . prettyPrec_ 0) bs) ]- Bucket b e r ->+ Bucket b ee r -> ppFun p "bucket" [ ppArg b- , ppArg e+ , ppArg ee , toDoc $ parens True (prettyPrec_ p r) ]- + Superpose_ pes -> case pes of (e1,e2) L.:| [] ->@@ -223,7 +276,7 @@ parens (p > 0) $ adjustHead (PP.text "lam $" <+>) (ppBinder e1) ppSCon p App_ = \(e1 :* e2 :* End) -> ppBinop "`app`" 9 LeftAssoc p e1 e2 -- BUG: this puts extraneous parentheses around e2 when it's a function application... ppSCon p Let_ = \(e1 :* e2 :* End) ->- parens (p > 0) $ + parens (p > 0) $ adjustHead (PP.text "let_" <+> ppArg e1 <+> PP.char '$' <+>) (ppBinder e2)@@ -245,13 +298,7 @@ adjustHead (prettyPrec 1 e1 <+> PP.text ">>=" <+>) (ppBinder e2)-ppSCon p Expect = \(e1 :* e2 :* End) ->- -- N.B., for this to be read back in correctly, "Language.Hakaru.Expect" must be in scope as well as the prelude.- parens (p > 0) $- adjustHead- (PP.text "expect" <+> ppArg e1 <+> PP.char '$' <+>)- (ppBinder e2)-ppSCon p Observe = \(e1 :* e2 :* End) -> ppApply2 p "observe" e1 e2+ppSCon p (Transform_ t) = ppTransform p t ppSCon p Integrate = \(e1 :* e2 :* e3 :* End) -> ppFun p "integrate" [ ppArg e1@@ -272,7 +319,7 @@ , toDoc $ parens True (ppBinder e3) ] -ppSCon _ Plate = \(e1 :* e2 :* End) -> +ppSCon _ Plate = \(e1 :* e2 :* End) -> ppFun 11 "plate" [ ppArg e1 <+> PP.char '$' , toDoc $ ppBinder e2@@ -285,6 +332,19 @@ , toDoc $ ppBinder e3 ] +ppTransform :: (ABT Term abt)+ => Int -> Transform args a -> SArgs abt args -> Docs+ppTransform p t es =+ case t of+ Expect ->+ case es of+ e1 :* e2 :* End ->+ parens (p > 0) $+ adjustHead+ (PP.text "expect" <+> ppArg e1 <+> PP.char '$' <+>)+ (ppBinder e2)+ _ -> ppApply p (transformName t) es+ ppCoerceTo :: ABT Term abt => Int -> Coercion a b -> abt '[] a -> Docs ppCoerceTo = -- BUG: this may not work quite right when the coercion isn't one of the special named ones...@@ -346,6 +406,7 @@ ppPrimOp p Acosh = \(e1 :* End) -> ppApply1 p "acosh" e1 ppPrimOp p Atanh = \(e1 :* End) -> ppApply1 p "atanh" e1 ppPrimOp p RealPow = \(e1 :* e2 :* End) -> ppBinop "**" 8 RightAssoc p e1 e2+ppPrimOp p Choose = \(e1 :* e2 :* End) -> ppApply2 p "choose" e1 e2 ppPrimOp p Exp = \(e1 :* End) -> ppApply1 p "exp" e1 ppPrimOp p Log = \(e1 :* End) -> ppApply1 p "log" e1 ppPrimOp _ (Infinity _) = \End -> [PP.text "infinity"]@@ -361,7 +422,8 @@ ppPrimOp p (NatRoot _) = \(e1 :* e2 :* End) -> -- N.B., argument order is swapped! ppBinop "`thRootOf`" 9 LeftAssoc p e2 e1-ppPrimOp p (Erf _) = \(e1 :* End) -> ppApply1 p "erf" e1+ppPrimOp p (Erf _) = \(e1 :* End) -> ppApply1 p "erf" e1+ppPrimOp p Floor = \(e1 :* End) -> ppApply1 p "floor" e1 -- | Pretty-print a 'ArrayOp' @(:$)@ node in the AST.@@ -384,7 +446,7 @@ ppMeasureOp :: (ABT Term abt, typs ~ UnLCs args, args ~ LCs typs) => Int -> MeasureOp typs a -> SArgs abt args -> Docs-ppMeasureOp _ Lebesgue = \End -> [PP.text "lebesgue"]+ppMeasureOp p Lebesgue = \(e1 :* e2 :* End) -> ppApply2 p "lebesgue" e1 e2 ppMeasureOp _ Counting = \End -> [PP.text "counting"] ppMeasureOp p Categorical = \(e1 :* End) -> ppApply1 p "categorical" e1 ppMeasureOp p Uniform = \(e1 :* e2 :* End) -> ppApply2 p "uniform" e1 e2@@ -405,7 +467,7 @@ | Text.null hint = ppFun p "datum_" [error "TODO: prettyPrec_@Datum"]- | otherwise = + | otherwise = ppFun p "ann_" [ PP.parens . PP.text . show $ _typ , PP.parens . toDoc $ ppFun p (Text.unpack hint)@@ -465,12 +527,12 @@ , toDoc $ prettyPrec_ 11 r1 , toDoc $ prettyPrec_ 11 r2 ]- prettyPrec_ p Red_Nop =+ prettyPrec_ _ Red_Nop = [ PP.text "r_nop" ] prettyPrec_ p (Red_Add _ e) = ppFun p "r_add" [ toDoc $ parens True (ppUncurryBinder e)]- + ---------------------------------------------------------------- -- | For the \"@lam $ \x ->\n@\" style layout. adjustHead :: (Doc -> Doc) -> Docs -> Docs@@ -509,6 +571,9 @@ :: (ABT Term abt) => Int -> String -> abt '[] a -> abt '[] b -> Docs ppApply2 p f e1 e2 = ppFun p f [ppArg e1, ppArg e2] +ppApply+ :: (ABT Term abt) => Int -> String -> SArgs abt as -> Docs+ppApply p f es = ppFun p f $ foldMap21 ppBinder es -- | Something prettier than 'PP.rational'. This works correctly -- for both 'Rational' and 'NonNegativeRational', though it may not@@ -557,12 +622,27 @@ LeftAssoc -> (p0, 1 + p0) RightAssoc -> (1 + p0, p0) NonAssoc -> (1 + p0, 1 + p0)- in \p e1 e2 -> + in \p e1 e2 -> parens (p > p0) [ prettyPrec p1 e1 , PP.text op <+> prettyPrec p2 e2 ]++header :: [Text.Text]+header =+ [ "{-# LANGUAGE DataKinds, NegativeLiterals #-}"+ , "module Prog where"+ , ""+ , "import Data.Number.LogFloat (LogFloat)"+ , "import Prelude hiding (product, exp, log, (**), pi)"+ , "import Language.Hakaru.Runtime.LogFloatPrelude"+ , "import Language.Hakaru.Runtime.CmdLine"+ , "import Language.Hakaru.Types.Sing"+ , "import qualified System.Random.MWC as MWC"+ , "import Control.Monad"+ , "import System.Environment (getArgs)"+ , "" ] ---------------------------------------------------------------- ----------------------------------------------------------- fin.
haskell/Language/Hakaru/Pretty/Maple.hs view
@@ -123,7 +123,7 @@ o :$ es -> mapleSCon o es NaryOp_ op es -> mapleNary op es Literal_ v -> mapleLiteral v- Empty_ _ -> error "TODO: mapleAST{Empty}"+ Empty_ _ -> brackets id Array_ e1 e2 -> caseBind e2 $ \x e2' -> app3 "ary" e1 (var x) e2'@@ -155,8 +155,16 @@ var1 :: Variable (a :: Hakaru) -> ShowS var1 x | Text.null (varHint x) = showChar 'x' . (shows . fromNat . varID) x- | otherwise = showString (Text.unpack (varHint x))+ | otherwise = quoteName . Text.unpack . varHint $ x +quoteName :: String -> ShowS+quoteName s =+ foldr1 (.) $ map showString+ ["`", concatMap quoteChar s, "`"]+ where quoteChar '`' = "\\`"+ quoteChar '\\' = "\\\\"+ quoteChar c = [c]+ list1vars :: List1 Variable (vars :: [Hakaru]) -> [String] list1vars Nil1 = [] list1vars (Cons1 x xs) = var1 x [] : list1vars xs@@ -216,17 +224,12 @@ . showString "..(" . arg e2 . showString ")-1)"-mapleSCon Expect = \(e1 :* e2 :* End) ->- error "TODO: mapleSCon{Expect}"- {-- caseBind e2 $ \x e2' ->- arg- . expect e1- . binder Text.empty (varType x)- $ \x' -> subst x x' e2'- -} +mapleSCon (Transform_ t) = \_ -> error $+ concat [ "mapleSCon{", show t, "}"+ , ": Maple doesn't recognize transforms; expand them first" ] + mapleNary :: (ABT Term abt) => NaryOp a -> Seq (abt '[] a) -> ShowS mapleNary And = appN "And" mapleNary Or = appN "Or"@@ -310,6 +313,7 @@ maplePrimOp Sin (e1 :* End) = app1 "sin" e1 maplePrimOp RealPow (e1 :* e2 :* End) = parens (arg e1 . showString " ^ " . arg e2)+maplePrimOp Choose (e1 :* e2 :* End) = app2 "binomial" e1 e2 maplePrimOp Exp (e1 :* End) = app1 "exp" e1 maplePrimOp Log (e1 :* End) = app1 "log" e1 maplePrimOp (Infinity _) End = showString "infinity"@@ -325,6 +329,7 @@ maplePrimOp (Abs _) (e1 :* End) = app1 "abs" e1 maplePrimOp (Recip _) (e1 :* End) = app1 "1/" e1 maplePrimOp (NatRoot _) (e1 :* e2 :* End) = app2 "root" e1 e2+maplePrimOp Floor (e1 :* End) = app1 "floor" e1 maplePrimOp x _ = error $ "TODO: maplePrimOp{" ++ show x ++ "}" @@ -338,7 +343,7 @@ mapleMeasureOp :: (ABT Term abt, typs ~ UnLCs args, args ~ LCs typs) => MeasureOp typs a -> SArgs abt args -> ShowS-mapleMeasureOp Lebesgue = \End -> showString "Lebesgue(-infinity,infinity)"+mapleMeasureOp Lebesgue = \(e1 :* e2 :* End) -> app2 "Lebesgue" e1 e2 mapleMeasureOp Counting = \End -> showString "Counting(-infinity,infinity)" mapleMeasureOp Categorical = \(e1 :* End) -> app1 "Categorical" e1 mapleMeasureOp Uniform = \(e1 :* e2 :* End) -> app2 "Uniform" e1 e2
+ haskell/Language/Hakaru/Pretty/SExpression.hs view
@@ -0,0 +1,316 @@+{-# LANGUAGE CPP+ , GADTs+ , KindSignatures+ , DataKinds+ , ScopedTypeVariables+ , PatternGuards+ , Rank2Types+ , TypeOperators+ , FlexibleContexts+ , UndecidableInstances+ #-}+module Language.Hakaru.Pretty.SExpression where++#if __GLASGOW_HASKELL__ < 710+import Data.Foldable (foldMap)+import Control.Applicative ((<$>))+#endif++import Data.Ratio+import Data.Text (Text)+import Data.Sequence (Seq)++import qualified Data.Text as Text+import Data.Number.Nat (fromNat)+import Data.Number.Natural (fromNonNegativeRational)+import qualified Data.List.NonEmpty as L+import Data.Text.IO as IO+import Language.Hakaru.Command (parseAndInfer)+import Language.Hakaru.Syntax.IClasses (jmEq1, TypeEq(..))+import Language.Hakaru.Types.Coercion+import Language.Hakaru.Types.DataKind+import Language.Hakaru.Types.HClasses+import Language.Hakaru.Types.Sing++import Language.Hakaru.Summary+import Language.Hakaru.Syntax.ABT+import Language.Hakaru.Syntax.AST+import Language.Hakaru.Syntax.AST.Transforms+import Language.Hakaru.Syntax.Datum+import Language.Hakaru.Syntax.Reducer+import Language.Hakaru.Syntax.TypeCheck+import Language.Hakaru.Syntax.TypeOf+import Prelude hiding ((<>))+import Text.PrettyPrint (Doc, (<>), (<+>))+import Text.PrettyPrint as PP++pretty :: (ABT Term abt) => abt '[] a -> Doc+pretty a =+ PP.brackets (caseVarSyn a prettyVariable prettyTerm <+>+ PP.colon <+> prettyType (typeOf a))++prettyTerm :: (ABT Term abt) => Term abt a -> Doc+prettyTerm (o :$ es) = PP.parens $ prettySCons o es+prettyTerm (NaryOp_ op es) = PP.parens $ prettyNary op es+prettyTerm (Literal_ v) = prettyLiteral v+prettyTerm (Array_ e1 e2) =+ PP.parens $ (PP.text "array") <+>+ (caseBind e2 $ \x e2' ->+ PP.parens (prettyVariable x <+> pretty e1) <+>+ pretty e2')+prettyTerm (Case_ e1 bs) =+ PP.parens $ PP.text "match" <+> pretty e1 <+>+ Prelude.foldl (<+>) PP.empty (prettyBranch <$> bs)+prettyTerm (Bucket b e r) =+ PP.parens $ ( PP.text "bucket" <+> pretty b <+> pretty e <+> prettyReducer r)+prettyTerm (Reject_ _) = PP.parens $ PP.text "reject"+prettyTerm (Empty_ _) = PP.parens $ PP.text "empty"+prettyTerm (ArrayLiteral_ es) = PP.parens $ (PP.text "array-literal" <+> foldMap pretty es)+prettyTerm (Superpose_ pes) =+ case pes of+ (e1,e2) L.:| [] ->+ PP.parens $+ (PP.text "pose" <+> pretty e1 <+> pretty e2)+ _ ->+ PP.parens $+ (PP.text "superpose" <+> foldMap (\(e1,e2) -> PP.parens (pretty e1 <+> pretty e2)) (L.toList pes))++-- prettyTerm (Datum_ (Datum "true" _typ (Inl Done))) = PP.text "#t"+-- prettyTerm (Datum_ (Datum "false" _typ (Inr (Inl Done)))) = PP.text "#f"+prettyTerm (Datum_ d) = prettyDatum d++prettyDatum :: (ABT Term abt) => Datum (abt '[]) t -> Doc+prettyDatum (Datum hint _ d) =+ PP.parens $+ PP.text "datum" <+>+ (PP.text (Text.unpack hint)) <+>+ (prettyDatumCode d)++prettyDatumCode :: (ABT Term abt) => DatumCode xss (abt '[]) a -> Doc+prettyDatumCode (Inr d) = PP.parens $ PP.text "inr" <+> (prettyDatumCode d)+prettyDatumCode (Inl d) = PP.parens $ PP.text "inl" <+> (prettyDatumStruct d)++prettyDatumStruct :: (ABT Term abt) => DatumStruct xs (abt '[]) a -> Doc+prettyDatumStruct Done = PP.text "done"+prettyDatumStruct (Et d1 d2) =+ PP.parens $ PP.text "et" <+> (prettyDatumFun d1) <+> (prettyDatumStruct d2)++prettyDatumFun :: (ABT Term abt) => DatumFun x (abt '[]) a -> Doc+prettyDatumFun (Konst a) = PP.parens $ PP.text "konst" <+> pretty a+prettyDatumFun (Ident a) = PP.parens $ PP.text "ident" <+> pretty a++++prettyReducer :: (ABT Term abt) => Reducer abt xs a -> Doc+prettyReducer (Red_Fanout red_a red_b) =+ PP.parens (PP.text "r_fanout" <+> prettyReducer red_a <+> prettyReducer red_b)+prettyReducer (Red_Index i red_i red_a) =+ PP.parens (PP.text "r_index" <+> prettyViewABT i <+>+ prettyViewABT red_i <+> prettyReducer red_a)+prettyReducer (Red_Split i red_a red_b) =+ PP.parens (PP.text "r_split" <+> prettyViewABT i <+>+ prettyReducer red_a <+> prettyReducer red_b)+prettyReducer (Red_Nop) = PP.text "r_nop"+prettyReducer (Red_Add _ a) =+ PP.parens (PP.text "r_add" <+> prettyViewABT a)++prettyBranch :: (ABT Term abt) => Branch a abt b -> Doc+prettyBranch (Branch pat e) =+ PP.parens $ prettyPattern pat <+> prettyViewABT e++prettyPattern :: Pattern xs a -> Doc+prettyPattern PWild = PP.text "*"+prettyPattern PVar = PP.text "var"+prettyPattern (PDatum hint c) =+ PP.parens $ PP.text "pdatum" <+> PP.text (Text.unpack hint) <+> goCode c+goCode :: PDatumCode xss vars a -> Doc+goCode c = PP.parens $ case c of+ (PInr d) -> PP.text "pc_inr" <+> goCode d+ (PInl s) -> PP.text "pc_inl" <+> goStruct s+goStruct :: PDatumStruct xs vars a -> Doc+goStruct s = PP.parens $ case s of+ (PDone) -> PP.text "ps_done"+ (PEt f s') -> PP.text "ps_et" <+> goFun f <+> goStruct s'+goFun :: PDatumFun x vars a -> Doc+goFun f = PP.parens $ case f of+ (PKonst p) -> PP.text "pf_konst" <+> prettyPattern p+ (PIdent p) -> PP.text "pf_ident" <+> prettyPattern p+++prettyViewABT :: (ABT Term abt) => abt xs a -> Doc+prettyViewABT = prettyView . viewABT++prettyView :: (ABT Term abt) => View (Term abt) xs a -> Doc+prettyView (Bind x v) =+ PP.parens $ PP.text "bind" <+> prettyVariable x <+> prettyView v+prettyView (Var x) = prettyVariable x+prettyView (Syn t) = pretty (syn t)++prettyShow :: (Show a) => a -> Doc+prettyShow = PP.text . show++prettyLiteral :: Literal a -> Doc+prettyLiteral (LNat v) = PP.parens $ PP.text "nat_" <+> prettyShow v+prettyLiteral (LInt i) = PP.parens $ PP.text "int_" <+> prettyShow i+prettyLiteral (LProb p) = PP.parens $ PP.text "prob_" <+> PP.rational (fromNonNegativeRational p)+prettyLiteral (LReal p) = PP.parens $ PP.text "real_" <+> PP.rational p+++prettyRatio :: (Show a, Integral a) => Ratio a -> Doc+prettyRatio r+ | d == 1 = prettyShow n+ | otherwise = PP.parens $ PP.text "/" <+> prettyShow n <+> prettyShow d+ where+ d = denominator r+ n = numerator r++prettyVariable :: Variable (a :: Hakaru) -> Doc+prettyVariable x | Text.null (varHint x) = PP.text "_" <> (PP.int . fromNat .varID) x+ | otherwise = (PP.text . Text.unpack . varHint) x++prettySCons :: (ABT Term abt) => SCon args a -> SArgs abt args -> Doc+prettySCons Lam_ (e1 :* End) = caseBind e1 $ \x e1' ->+ PP.text "fn" <+> prettyVariable x <+> (prettyType $ typeOf e1')+ <+> pretty e1'+prettySCons (PrimOp_ o) es = prettyPrimOp o es+prettySCons (ArrayOp_ o) es = prettyArrayOp o es+prettySCons (CoerceTo_ o) (e1 :* End) = PP.text (pCoerce o) <+> pretty e1+prettySCons (Summate _ _) (e1 :* e2 :* e3 :* End) =+ caseBind e3 $ \x e3' -> PP.text "summate" <+>+ PP.parens (prettyVariable x <+> pretty e1 <+> pretty e2) <+>+ pretty e3'+prettySCons (Product _ _) (e1 :* e2 :* e3 :* End) =+ caseBind e3 $ \x e3' -> PP.text "product" <+>+ PP.parens (prettyVariable x <+> pretty e1 <+> pretty e2) <+>+ pretty e3'+prettySCons App_ (e1 :* e2 :* End) = PP.text "app" <+> pretty e1 <+> pretty e2+prettySCons Let_ (e1 :* e2 :* End) = caseBind e2 $ \x e2' ->+ PP.text "let" <+>+ PP.parens (prettyVariable x <+> (prettyType $ typeOf e1) <+> pretty e1)+ <+> pretty e2'+prettySCons (UnsafeFrom_ o) (e :* End) = PP.text (pUnsafeCoerce o) <+> pretty e+prettySCons (MeasureOp_ o) es = prettyMeasureOp o es+prettySCons Dirac (e1 :* End) = PP.text "dirac" <+> pretty e1+prettySCons MBind (e1 :* e2 :* End) = PP.text "mbind" <+> pretty e1 <+> prettyViewABT e2+prettySCons Plate (e1 :* e2 :* End) = PP.text "plate" <+> pretty e1 <+> prettyViewABT e2+prettySCons Chain (e1 :* e2 :* e3 :* End) = PP.text "chain" <+> pretty e1 <+> pretty e2 <+> prettyViewABT e3+prettySCons Integrate (e1 :* e2 :* e3 :* End) = PP.text "integrate" <+> pretty e1 <+> pretty e2 <+> prettyViewABT e3+prettySCons (Transform_ t) _ = PP.text $+ Prelude.concat [ "SCons{", show t, "}: TODO" ]++prettyMeasureOp+ :: (ABT Term abt, typs ~ UnLCs args, args ~ LCs typs)+ => MeasureOp typs a -> SArgs abt args -> Doc+prettyMeasureOp Lebesgue = \(e1 :* e2 :* End) -> PP.text "lebesgue" <+> pretty e1 <+> pretty e2+prettyMeasureOp Counting = \End -> PP.text "counting"+prettyMeasureOp Categorical = \(e1 :* End) -> PP.text "categorical" <+> pretty e1+prettyMeasureOp Uniform = \(e1 :* e2 :* End) -> PP.text "uniform" <+> pretty e1 <+> pretty e2+prettyMeasureOp Normal = \(e1 :* e2 :* End) -> PP.text "normal" <+> pretty e1 <+> pretty e2+prettyMeasureOp Poisson = \(e1 :* End) -> PP.text "poisson" <+> pretty e1+prettyMeasureOp Gamma = \(e1 :* e2 :* End) -> PP.text "gamma" <+> pretty e1 <+> pretty e2+prettyMeasureOp Beta = \(e1 :* e2 :* End) -> PP.text "beta" <+> pretty e1 <+> pretty e2++pUnsafeCoerce :: Coercion a b -> String+pUnsafeCoerce (CCons (Signed HRing_Real) CNil) = "real2prob"+pUnsafeCoerce (CCons (Signed HRing_Int) CNil) = "int2nat"+pUnsafeCoerce c = "unsafeFrom_" ++ show c++pCoerce :: Coercion a b -> String+pCoerce (CCons (Signed HRing_Real) CNil) = "prob2real"+pCoerce (CCons (Signed HRing_Int) CNil) = "nat2int"+pCoerce (CCons (Continuous HContinuous_Real) CNil) = "int2real"+pCoerce (CCons (Continuous HContinuous_Prob) CNil) = "nat2prob"+pCoerce (CCons (Continuous HContinuous_Prob)+ (CCons (Signed HRing_Real) CNil)) = "nat2real"+pCoerce (CCons (Signed HRing_Int)+ (CCons (Continuous HContinuous_Real) CNil)) = "nat2real"+pCoerce c = "coerceTo_"++show c+++prettyNary :: (ABT Term abt) => NaryOp a -> Seq (abt '[] a) -> Doc+prettyNary And es = PP.text "and" <+> foldMap pretty es+prettyNary Or es = PP.text "or" <+> foldMap pretty es+prettyNary Xor es = PP.text "xor" <+> foldMap pretty es+prettyNary (Sum _) es = PP.text "+" <+> foldMap pretty es+prettyNary (Prod _) es = PP.text "*" <+> foldMap pretty es+prettyNary (Min _) es = PP.text "min" <+> foldMap pretty es+prettyNary (Max _) es = PP.text "max" <+> foldMap pretty es+prettyNary _ _ = error "Pretty.SExpression - prettyNary missing cases"++prettyType :: Sing (a :: Hakaru) -> Doc+prettyType SNat = PP.text "nat"+prettyType SInt = PP.text "int"+prettyType SProb = PP.text "prob"+prettyType SReal = PP.text "real"+prettyType (SArray a) = PP.parens $ PP.text "array" <+> prettyType a+prettyType (SMeasure a) = PP.parens $ PP.text "measure" <+> prettyType a+prettyType (SFun a b) = PP.parens $ prettyType a <+> PP.text "->" <+> prettyType b+prettyType typ =+ case typ of+ SData (STyCon sym `STyApp` a `STyApp` b) _+ | Just Refl <- jmEq1 sym sSymbol_Pair+ -> PP.parens $ PP.text "pair" <+> prettyType a <+> prettyType b+ | Just Refl <- jmEq1 sym sSymbol_Either+ -> PP.parens $ PP.text "either" <+> prettyType a <+> prettyType b+ SData (STyCon sym `STyApp` a) _+ | Just Refl <- jmEq1 sym sSymbol_Maybe+ -> PP.parens $ PP.text "maybe" <+> prettyType a+ SData (STyCon sym) _+ | Just Refl <- jmEq1 sym sSymbol_Bool+ -> PP.text "bool"+ | Just Refl <- jmEq1 sym sSymbol_Unit+ -> PP.text "unit"+ _ -> PP.text (showsPrec 11 typ "")++prettyPrimOp+ :: (ABT Term abt, typs ~ UnLCs args, args ~ LCs typs)+ => PrimOp typs a -> SArgs abt args -> Doc+prettyPrimOp Not (e1 :* End) = PP.text "not" <+> pretty e1+prettyPrimOp Pi End = PP.text "pi"+prettyPrimOp Sin (e1 :* End) = PP.text "sin" <+> pretty e1+prettyPrimOp Cos (e1 :* End) = PP.text "cos" <+> pretty e1+prettyPrimOp Tan (e1 :* End) = PP.text "tan" <+> pretty e1+prettyPrimOp RealPow (e1 :* e2 :* End) = PP.text "realpow" <+> pretty e1 <+> pretty e2+prettyPrimOp Choose (e1 :* e2 :* End) = PP.text "choose" <+> pretty e1 <+> pretty e2+prettyPrimOp Exp (e1 :* End) = PP.text "exp" <+> pretty e1+prettyPrimOp Log (e1 :* End) = PP.text "log" <+> pretty e1+prettyPrimOp (Infinity _) End = PP.text "infinity"+prettyPrimOp GammaFunc (e1 :* End) = PP.text "gammafunc" <+> pretty e1+prettyPrimOp BetaFunc (e1 :* e2 :* End) = PP.text "betafunc" <+> pretty e1 <+> pretty e2+prettyPrimOp (Equal _) (e1 :* e2 :* End) = PP.text "==" <+> pretty e1 <+> pretty e2+prettyPrimOp (Less _) (e1 :* e2 :* End) = PP.text "<" <+> pretty e1 <+> pretty e2+prettyPrimOp (NatPow _) (e1 :* e2 :* End) = PP.text "natpow" <+> pretty e1 <+> pretty e2+prettyPrimOp (Negate _) (e1 :* End) = PP.text "negate" <+> pretty e1+prettyPrimOp (Abs _) (e1 :* End) = PP.text "abs" <+> pretty e1+prettyPrimOp (Recip _) (e1 :* End) = PP.text "recip" <+> pretty e1+prettyPrimOp (NatRoot _) (e1 :* e2 :* End) = PP.text "root" <+> pretty e1 <+> pretty e2+prettyPrimOp Floor (e1 :* End) = PP.text "floor" <+> pretty e1+prettyPrimOp _ _ = error "prettyPrimop: a bunch of cases still need done!"++prettyArrayOp+ :: (ABT Term abt, typs ~ UnLCs args, args ~ LCs typs)+ => ArrayOp typs a -> SArgs abt args -> Doc+prettyArrayOp (Index _) (e1 :* e2 :* End) = PP.text "index" <+> pretty e1 <+> pretty e2+prettyArrayOp (Size _) (e1 :* End) = PP.text "size" <+> pretty e1+prettyArrayOp (Reduce _) _ = error "prettyArrayOp doesn't know how to print Reduce"++prettyFile' :: [Char] -> [Char] -> IO ()+prettyFile' fname outFname = do+ fileText <- IO.readFile fname+ prettyText <- runPretty' fileText+ IO.writeFile outFname (Text.pack prettyText)+ print prettyText++runPretty' :: Text -> IO String+runPretty' prog =+ case parseAndInfer prog of+ Left _ -> return "err"+ Right (TypedAST _ ast) -> do+ summarised <- summary . expandTransformations $ ast+ return . render . pretty $ summarised++fromAst :: Either Text (TypedAST (TrivialABT Term)) -> String+fromAst prog =+ case prog of+ Left err -> Text.unpack err+ Right (TypedAST _ ast) -> render . pretty . expandTransformations $ ast
haskell/Language/Hakaru/Runtime/CmdLine.hs view
@@ -6,16 +6,38 @@ module Language.Hakaru.Runtime.CmdLine where import qualified Data.Vector.Unboxed as U-import qualified Data.Vector.Generic as G import qualified System.Random.MWC as MWC-import Language.Hakaru.Runtime.Prelude-import Data.Number.LogFloat-import Control.Monad (forever)+import Control.Monad (liftM, ap, forever) #if __GLASGOW_HASKELL__ < 710-import Data.Functor+import Data.Functor+import Control.Applicative (Applicative(..)) #endif +newtype Measure a = Measure { unMeasure :: MWC.GenIO -> IO (Maybe a) }++instance Functor Measure where+ fmap = liftM+ {-# INLINE fmap #-}++instance Applicative Measure where+ pure x = Measure $ \_ -> return (Just x)+ {-# INLINE pure #-}+ (<*>) = ap+ {-# INLINE (<*>) #-}++instance Monad Measure where+ return = pure+ {-# INLINE return #-}+ m >>= f = Measure $ \g -> do+ Just x <- unMeasure m g+ unMeasure (f x) g+ {-# INLINE (>>=) #-}++makeMeasure :: (MWC.GenIO -> IO a) -> Measure a+makeMeasure f = Measure $ \g -> Just <$> f g+{-# INLINE makeMeasure #-}+ -- A class of types that can be parsed from command line arguments class Parseable a where parse :: String -> IO a@@ -29,16 +51,17 @@ instance (U.Unbox a, Parseable a) => Parseable (U.Vector a) where parse s = U.fromList <$> ((mapM parse) =<< (lines <$> readFile s)) +instance (Read a, Read b) => Parseable (a, b) where+ parse = return . read+ {- Make main needs to recur down the function type while at the term level build -- up a continuation of parses and partial application of the function -} class MakeMain p where makeMain :: p -> [String] -> IO () -instance MakeMain Int where- makeMain p _ = print p--instance MakeMain Double where+instance {-# OVERLAPPABLE #-}+ Show a => MakeMain a where makeMain p _ = print p instance Show a => MakeMain (Measure a) where@@ -49,12 +72,7 @@ Nothing -> return () Just s -> print s -instance {-# OVERLAPPABLE #-}- ( Show (v a), (G.Vector (MayBoxVec a) a), v ~ MayBoxVec a)- => MakeMain (v a) where- makeMain p _ = print p--instance {-# OVERLAPPING #-}(Parseable a, MakeMain b)+instance (Parseable a, MakeMain b) => MakeMain (a -> b) where makeMain p (a:as) = do a' <- parse a makeMain (p a') as
− haskell/Language/Hakaru/Runtime/LogFloatCmdLine.hs
@@ -1,74 +0,0 @@-{-# LANGUAGE CPP,- FlexibleContexts,- FlexibleInstances,- UndecidableInstances,- TypeFamilies #-}-module Language.Hakaru.Runtime.LogFloatCmdLine where--import qualified Data.Vector.Unboxed as U-import qualified Data.Vector.Generic as G-import qualified System.Random.MWC as MWC-import Language.Hakaru.Runtime.LogFloatPrelude-import Data.Number.LogFloat-import Control.Monad (forever)--#if __GLASGOW_HASKELL__ < 710-import Data.Functor-#endif---- This Read instance really should be the logfloat package-instance Read LogFloat where- readsPrec p s = [(logFloat x, r) | (x, r) <- readsPrec p s]---- A class of types that can be parsed from command line arguments-class Parseable a where- parse :: String -> IO a--instance Parseable Int where- parse = return . read--instance Parseable Double where- parse = return . read--instance Parseable LogFloat where- parse = return . read--instance (U.Unbox a, Parseable a) => Parseable (U.Vector a) where- parse s = U.fromList <$> ((mapM parse) =<< (lines <$> readFile s))--instance (Read a, Read b, Parseable a, Parseable b) => Parseable (a, b) where- parse = return . read--{- Make main needs to recur down the function type while at the term level build--- up a continuation of parses and partial application of the function--}-class MakeMain p where- makeMain :: p -> [String] -> IO ()--instance MakeMain Int where- makeMain p _ = print p--instance MakeMain Double where- makeMain p _ = print p--instance MakeMain LogFloat where- makeMain p _ = print p--instance Show a => MakeMain (Measure a) where- makeMain p _ = MWC.createSystemRandom >>= \gen ->- forever $ do- ms <- unMeasure p gen- case ms of- Nothing -> return ()- Just s -> print s--instance {-# OVERLAPPABLE #-}- ( Show (v a), (G.Vector (MayBoxVec a) a), v ~ MayBoxVec a)- => MakeMain (v a) where- makeMain p _ = print p--instance {-# OVERLAPPING #-}(Parseable a, MakeMain b)- => MakeMain (a -> b) where- makeMain p (a:as) = do a' <- parse a- makeMain (p a') as- makeMain _ [] = error "not enough arguments"
haskell/Language/Hakaru/Runtime/LogFloatPrelude.hs view
@@ -10,7 +10,7 @@ , OverloadedStrings #-} -{-# OPTIONS_GHC -Wall -fwarn-tabs -fsimpl-tick-factor=1000 #-}+{-# OPTIONS_GHC -Wall -fwarn-tabs -fsimpl-tick-factor=1000 -fno-warn-orphans #-} module Language.Hakaru.Runtime.LogFloatPrelude where #if __GLASGOW_HASKELL__ < 710@@ -30,9 +30,18 @@ import qualified Data.Vector.Generic.Mutable as M import Control.Monad import Control.Monad.ST+import Numeric.SpecFunctions (logBeta) import Prelude hiding (init, sum, product, exp, log, (**), pi) import qualified Prelude as P+import Language.Hakaru.Runtime.CmdLine (Parseable(..), Measure(..), makeMeasure) +-- This Read instance really should be the logfloat package+instance Read LogFloat where+ readsPrec p s = [(logFloat x, r) | (x, r) <- readsPrec p s]++instance Parseable LogFloat where+ parse = return . read+ type family MinBoxVec (v1 :: * -> *) (v2 :: * -> *) :: * -> * type instance MinBoxVec V.Vector v = V.Vector type instance MinBoxVec v V.Vector = V.Vector@@ -101,6 +110,7 @@ = G.basicUnsafeCopy mv v elemseq _ x z = G.elemseq (undefined :: U.Vector a) (logFromLogFloat x) z +type Prob = LogFloat lam :: (a -> b) -> a -> b lam = id@@ -118,59 +128,37 @@ ann_ _ a = a {-# INLINE ann_ #-} -exp :: Double -> LogFloat+exp :: Double -> Prob exp = logToLogFloat {-# INLINE exp #-} -log :: LogFloat -> Double+log :: Prob -> Double log = logFromLogFloat {-# INLINE log #-} -newtype Measure a = Measure { unMeasure :: MWC.GenIO -> IO (Maybe a) }--instance Functor Measure where- fmap = liftM- {-# INLINE fmap #-}--instance Applicative Measure where- pure x = Measure $ \_ -> return (Just x)- {-# INLINE pure #-}- (<*>) = ap- {-# INLINE (<*>) #-}--instance Monad Measure where- return = pure- {-# INLINE return #-}- m >>= f = Measure $ \g -> do- Just x <- unMeasure m g- unMeasure (f x) g- {-# INLINE (>>=) #-}--makeMeasure :: (MWC.GenIO -> IO a) -> Measure a-makeMeasure f = Measure $ \g -> Just <$> f g-{-# INLINE makeMeasure #-}+betaFunc :: Prob -> Prob -> Prob+betaFunc a b = exp (logBeta (fromProb a) (fromProb b)) uniform :: Double -> Double -> Measure Double uniform lo hi = makeMeasure $ MWC.uniformR (lo, hi) {-# INLINE uniform #-} -normal :: Double -> LogFloat -> Measure Double-normal mu sd = makeMeasure $ MWCD.normal mu (fromLogFloat sd)+normal :: Double -> Prob -> Measure Double+normal mu sd = makeMeasure $ MWCD.normal mu (fromProb sd) {-# INLINE normal #-} -beta :: LogFloat -> LogFloat -> Measure LogFloat+beta :: Prob -> Prob -> Measure Prob beta a b = makeMeasure $ \g ->- logFloat <$> MWCD.beta (fromLogFloat a) (fromLogFloat b) g+ unsafeProb <$> MWCD.beta (fromProb a) (fromProb b) g {-# INLINE beta #-} -gamma :: LogFloat -> LogFloat -> Measure LogFloat+gamma :: Prob -> Prob -> Measure Prob gamma a b = makeMeasure $ \g ->- logFloat <$> MWCD.gamma (fromLogFloat a) (fromLogFloat b) g+ unsafeProb <$> MWCD.gamma (fromProb a) (fromProb b) g {-# INLINE gamma #-} -categorical :: MayBoxVec LogFloat LogFloat -> Measure Int-categorical a = makeMeasure $ \g ->- fromIntegral <$> MWCD.categorical (U.map prep a) g+categorical :: MayBoxVec Prob Prob -> Measure Int+categorical a = makeMeasure $ MWCD.categorical (U.map prep a) where prep p = fromLogFloat (p / m) m = G.maximum a {-# INLINE categorical #-}@@ -266,6 +254,12 @@ just :: a -> Maybe a just = Just +left :: a -> Either a b+left = Left++right :: b -> Either a b+right = Right+ unit :: () unit = () @@ -293,9 +287,21 @@ pjust PVar c = Branch { extract = \ma -> case ma of Nothing -> Nothing Just x -> Just (c x) }-pjust _ _ = error "Runtime.Prelude pjust"+pjust _ _ = error "TODO: Runtime.Prelude{pjust}" +pleft :: Pattern -> (a -> c) -> Branch (Either a b) c+pleft PVar f = Branch { extract = \ma -> case ma of+ Right _ -> Nothing+ Left x -> Just (f x) }+pleft _ _ = error "TODO: Runtime.Prelude{pLeft}" +pright :: Pattern -> (b -> c) -> Branch (Either a b) c+pright PVar f = Branch { extract = \ma -> case ma of+ Left _ -> Nothing+ Right x -> Just (f x) }+pright _ _ = error "TODO: Runtime.Prelude{pRight}"++ ppair :: Pattern -> Pattern -> (x -> y -> b) -> Branch (x,y) b ppair PVar PVar c = Branch { extract = (\(x,y) -> Just (c x y)) } ppair _ _ _ = error "ppair: TODO"@@ -323,11 +329,11 @@ dirac = return {-# INLINE dirac #-} -pose :: LogFloat -> Measure a -> Measure a+pose :: Prob -> Measure a -> Measure a pose _ a = a {-# INLINE pose #-} -superpose :: [(LogFloat, Measure a)]+superpose :: [(Prob, Measure a)] -> Measure a superpose pms = do i <- categorical (G.fromList $ map fst pms)@@ -346,7 +352,7 @@ unsafeNat :: Int -> Int unsafeNat = id -nat2prob :: Int -> LogFloat+nat2prob :: Int -> Prob nat2prob = fromIntegral fromInt :: Int -> Double@@ -358,16 +364,16 @@ nat2real :: Int -> Double nat2real = fromIntegral -fromProb :: LogFloat -> Double+fromProb :: Prob -> Double fromProb = fromLogFloat -unsafeProb :: Double -> LogFloat+unsafeProb :: Double -> Prob unsafeProb = logFloat real_ :: Rational -> Double real_ = fromRational -prob_ :: NonNegativeRational -> LogFloat+prob_ :: NonNegativeRational -> Prob prob_ = fromRational . fromNonNegativeRational infinity :: Double@@ -376,16 +382,16 @@ abs_ :: Num a => a -> a abs_ = abs -(**) :: LogFloat -> Double -> LogFloat+(**) :: Prob -> Double -> Prob (**) = pow {-# INLINE (**) #-} -pi :: LogFloat-pi = logFloat P.pi+pi :: Prob+pi = unsafeProb P.pi {-# INLINE pi #-} -thRootOf :: Int -> LogFloat -> LogFloat-thRootOf a b = b `pow` (recip $ fromIntegral a)+thRootOf :: Int -> Prob -> Prob+thRootOf a b = b ** (recip $ fromIntegral a) {-# INLINE thRootOf #-} array@@ -407,6 +413,15 @@ size :: (G.Vector (MayBoxVec a) a) => MayBoxVec a a -> Int size v = fromIntegral (G.length v) {-# INLINE size #-}++reduce+ :: (G.Vector (MayBoxVec a) a)+ => (a -> a -> a)+ -> a+ -> MayBoxVec a a+ -> a+reduce f n v = G.foldr f n v+{-# INLINE reduce #-} class Num a => Num' a where product :: Int -> Int -> (Int -> a) -> a
haskell/Language/Hakaru/Runtime/Prelude.hs view
@@ -27,6 +27,7 @@ import Control.Monad import Control.Monad.ST import Prelude hiding (product, init)+import Language.Hakaru.Runtime.CmdLine (Measure(..), makeMeasure) type family MinBoxVec (v1 :: * -> *) (v2 :: * -> *) :: * -> * type instance MinBoxVec V.Vector v = V.Vector@@ -42,6 +43,8 @@ type instance MayBoxVec (V.Vector a) = V.Vector type instance MayBoxVec (a,b) = MinBoxVec (MayBoxVec a) (MayBoxVec b) +type Prob = Double+ lam :: (a -> b) -> a -> b lam = id {-# INLINE lam #-}@@ -58,48 +61,26 @@ ann_ _ a = a {-# INLINE ann_ #-} -newtype Measure a = Measure { unMeasure :: MWC.GenIO -> IO (Maybe a) }--instance Functor Measure where- fmap = liftM- {-# INLINE fmap #-}--instance Applicative Measure where- pure x = Measure $ \_ -> return (Just x)- {-# INLINE pure #-}- (<*>) = ap- {-# INLINE (<*>) #-}--instance Monad Measure where- return = pure- {-# INLINE return #-}- m >>= f = Measure $ \g -> do- Just x <- unMeasure m g- unMeasure (f x) g- {-# INLINE (>>=) #-}--makeMeasure :: (MWC.GenIO -> IO a) -> Measure a-makeMeasure f = Measure $ \g -> Just <$> f g-{-# INLINE makeMeasure #-}- uniform :: Double -> Double -> Measure Double uniform lo hi = makeMeasure $ MWC.uniformR (lo, hi) {-# INLINE uniform #-} -normal :: Double -> Double -> Measure Double-normal mu sd = makeMeasure $ MWCD.normal mu sd+normal :: Double -> Prob -> Measure Double+normal mu sd = makeMeasure $ MWCD.normal mu (fromProb sd) {-# INLINE normal #-} -beta :: Double -> Double -> Measure Double-beta a b = makeMeasure $ MWCD.beta a b+beta :: Prob -> Prob -> Measure Prob+beta a b = makeMeasure $ \g ->+ unsafeProb <$> MWCD.beta (fromProb a) (fromProb b) g {-# INLINE beta #-} -gamma :: Double -> Double -> Measure Double-gamma a b = makeMeasure $ MWCD.gamma a b+gamma :: Prob -> Prob -> Measure Prob+gamma a b = makeMeasure $ \g ->+ unsafeProb <$> MWCD.gamma (fromProb a) (fromProb b) g {-# INLINE gamma #-} -categorical :: MayBoxVec Double Double -> Measure Int-categorical a = makeMeasure (\g -> fromIntegral <$> MWCD.categorical a g)+categorical :: MayBoxVec Prob Prob -> Measure Int+categorical a = makeMeasure $ MWCD.categorical a {-# INLINE categorical #-} plate :: (G.Vector (MayBoxVec a) a) =>@@ -217,7 +198,6 @@ | otherwise = Nothing {-# INLINE extractBool #-} - pnothing :: b -> Branch (Maybe a) b pnothing b = Branch { extract = \ma -> case ma of Nothing -> Just b@@ -269,14 +249,14 @@ dirac = return {-# INLINE dirac #-} -pose :: Double -> Measure a -> Measure a+pose :: Prob -> Measure a -> Measure a pose _ a = a {-# INLINE pose #-} -superpose :: [(Double, Measure a)]+superpose :: [(Prob, Measure a)] -> Measure a superpose pms = do- i <- makeMeasure $ MWCD.categorical (U.fromList $ map fst pms)+ i <- categorical (G.fromList $ map fst pms) snd (pms !! i) {-# INLINE superpose #-} @@ -292,7 +272,7 @@ unsafeNat :: Int -> Int unsafeNat = id -nat2prob :: Int -> Double+nat2prob :: Int -> Prob nat2prob = fromIntegral fromInt :: Int -> Double@@ -304,16 +284,16 @@ nat2real :: Int -> Double nat2real = fromIntegral -fromProb :: Double -> Double+fromProb :: Prob -> Double fromProb = id -unsafeProb :: Double -> Double+unsafeProb :: Double -> Prob unsafeProb = id real_ :: Rational -> Double real_ = fromRational -prob_ :: NonNegativeRational -> Double+prob_ :: NonNegativeRational -> Prob prob_ = fromRational . fromNonNegativeRational infinity :: Double@@ -322,7 +302,7 @@ abs_ :: Num a => a -> a abs_ = abs -thRootOf :: Int -> Double -> Double+thRootOf :: Int -> Prob -> Prob thRootOf a b = b ** (recip $ fromIntegral a) {-# INLINE thRootOf #-}
haskell/Language/Hakaru/Sample.hs view
@@ -15,19 +15,21 @@ module Language.Hakaru.Sample where -import Numeric.SpecFunctions (logGamma, logBeta, logFactorial)-import qualified Data.Number.LogFloat as LF--- import qualified Numeric.Integration.TanhSinh as TS-import qualified System.Random.MWC as MWC-import qualified System.Random.MWC.Distributions as MWCD+import Numeric.SpecFunctions (logFactorial)+import qualified Data.Number.LogFloat as LF+import qualified Math.Combinatorics.Exact.Binomial as EB+-- import qualified Numeric.Integration.TanhSinh as TS+import qualified System.Random.MWC as MWC+import qualified System.Random.MWC.CondensedTable as MWC+import qualified System.Random.MWC.Distributions as MWCD -import qualified Data.Vector as V+import qualified Data.Vector as V import Data.STRef import Data.Sequence (Seq)-import qualified Data.Foldable as F-import qualified Data.List.NonEmpty as L-import Data.List.NonEmpty (NonEmpty(..))-import Data.Maybe (fromMaybe)+import qualified Data.Foldable as F+import qualified Data.List.NonEmpty as L+import Data.List.NonEmpty (NonEmpty(..))+import Data.Maybe (fromMaybe) #if __GLASGOW_HASKELL__ < 710 import Control.Applicative (Applicative(..), (<$>))@@ -37,10 +39,10 @@ import Control.Monad.Identity import Control.Monad.Trans.Maybe import Control.Monad.State.Strict-import qualified Data.IntMap as IM+import qualified Data.IntMap as IM -import Data.Number.Nat (fromNat, unsafeNat)-import Data.Number.Natural (fromNatural, fromNonNegativeRational)+import Data.Number.Nat (fromNat)+import Data.Number.Natural (fromNatural, fromNonNegativeRational, Natural, unsafeNatural) import Language.Hakaru.Types.DataKind import Language.Hakaru.Types.Coercion import Language.Hakaru.Types.Sing@@ -194,7 +196,6 @@ evaluateSCon App_ (e1 :* e2 :* End) env = case evaluate e1 env of VLam f -> f (evaluate e2 env)- v -> case v of {} evaluateSCon Let_ (e1 :* e2 :* End) env = let v = evaluate e1 env in caseBind e2 $ \x e2' ->@@ -218,22 +219,19 @@ caseBind e2 $ \x' e2' -> case evaluate e2' (updateEnv (EAssoc x' a) env) of VMeasure y -> y p' g- v -> case v of {}- v -> case v of {} evaluateSCon Plate (n :* e2 :* End) env = case evaluate n env of VNat n' -> caseBind e2 $ \x e' -> VMeasure $ \(VProb p) g -> runMaybeT $ do (v', ps) <- fmap V.unzip . V.mapM (performMaybe g) $- V.generate (fromNat n') $ \v ->+ V.generate (fromInteger $ fromNatural n') $ \v -> evaluate e' $- updateEnv (EAssoc x . VNat $ unsafeNat v) env+ updateEnv (EAssoc x . VNat $ intToNatural v) env return ( VArray v'- , VProb $ p * V.product (V.map (\(VProb x) -> x) ps)+ , VProb $ p * V.product (V.map (\(VProb y) -> y) ps) )- v -> case v of {} where performMaybe :: MWC.GenIO@@ -247,16 +245,15 @@ caseBind e $ \x e' -> let s' = VLam $ \v -> evaluate e' (updateEnv (EAssoc x v) env) in VMeasure (\(VProb p) g -> runMaybeT $ do- (evaluates, sout) <- runStateT (replicateM (fromNat n') $ convert g s') start+ (evaluates, sout) <- runStateT (replicateM (unsafeInt n') $ convert g s') start let (v', ps) = unzip evaluates bodyType :: Sing ('HMeasure (HPair a b)) -> Sing ('HArray a) bodyType = SArray . fst . sUnPair . sUnMeasure return ( VDatum $ dPair_ (bodyType $ caseBind e (const typeOf)) (typeOf s) (VArray . V.fromList $ v') sout- , VProb $ p * product (map (\(VProb x) -> x) ps)+ , VProb $ p * product (map (\(VProb y) -> y) ps) ))- v -> case v of {} where convert :: MWC.GenIO@@ -268,7 +265,6 @@ (as'', p') <- MaybeT (f' (VProb 1) g) let (a, s'') = unPair as'' return ((a, p'), s'')- v -> case v of {} unPair :: Value (HPair a b) -> (Value a, Value b) unPair (VDatum (Datum "pair" _typ@@ -285,7 +281,6 @@ evaluate e3' (updateEnv (EAssoc x i) env)) (identityElement $ Sum hs) (enumFromUntilValue hd lo hi)- v -> case v of {} evaluateSCon (Product hd hs) (e1 :* e2 :* e3 :* End) env = case (evaluate e1 env, evaluate e2 env) of@@ -296,7 +291,6 @@ evaluate e3' (updateEnv (EAssoc x i) env)) (identityElement $ Prod hs) (enumFromUntilValue hd lo hi)- v -> case v of {} evaluateSCon s _ _ = error $ "TODO: evaluateSCon{" ++ show s ++ "}" @@ -311,49 +305,60 @@ VDatum a -> if a == dTrue then VDatum dFalse else VDatum dTrue- v -> case v of {} evaluatePrimOp Pi End _ = VProb . LF.logFloat $ pi evaluatePrimOp Cos (e1 :* End) env = case evaluate e1 env of VReal v1 -> VReal . cos $ v1- v -> case v of {}++evaluatePrimOp Sin (e1 :* End) env =+ case evaluate e1 env of+ VReal v1 -> VReal . sin $ v1++evaluatePrimOp Tan (e1 :* End) env =+ case evaluate e1 env of+ VReal v1 -> VReal . tan $ v1+ evaluatePrimOp RealPow (e1 :* e2 :* End) env = case (evaluate e1 env, evaluate e2 env) of (VProb v1, VReal v2) -> VProb $ LF.pow v1 v2- v -> case v of {}++evaluatePrimOp Choose (e1 :* e2 :* End) env =+ case (evaluate e1 env, evaluate e2 env) of+ (VNat v1, VNat v2) -> VNat $ EB.choose v1 v2+ evaluatePrimOp Exp (e1 :* End) env = case evaluate e1 env of VReal v1 -> VProb . LF.logToLogFloat $ v1- v -> case v of {}++evaluatePrimOp Log (e1 :* End) env =+ case evaluate e1 env of+ VProb v1 -> VReal . LF.logFromLogFloat $ v1+ evaluatePrimOp (Infinity h) End _ = case h of HIntegrable_Nat -> error "Can not evaluate infinity for natural numbers" HIntegrable_Prob -> VProb $ LF.logFloat LF.infinity -evaluatePrimOp (Equal _) (e1 :* e2 :* End) env =- case (evaluate e1 env, evaluate e2 env) of- (VNat v1, VNat v2) -> VDatum $ if v1 == v2 then dTrue else dFalse- (VInt v1, VInt v2) -> VDatum $ if v1 == v2 then dTrue else dFalse- (VProb v1, VProb v2) -> VDatum $ if v1 == v2 then dTrue else dFalse- (VReal v1, VReal v2) -> VDatum $ if v1 == v2 then dTrue else dFalse- v -> error "TODO: evaluatePrimOp{Equal}"+evaluatePrimOp (Equal _) (e1 :* e2 :* End) env = (VDatum . dBool) $ evaluate e1 env == evaluate e2 env+ evaluatePrimOp (Less _) (e1 :* e2 :* End) env = case (evaluate e1 env, evaluate e2 env) of (VNat v1, VNat v2) -> VDatum $ if v1 < v2 then dTrue else dFalse+ (VInt v1, VInt v2) -> VDatum $ if v1 < v2 then dTrue else dFalse (VProb v1, VProb v2) -> VDatum $ if v1 < v2 then dTrue else dFalse (VReal v1, VReal v2) -> VDatum $ if v1 < v2 then dTrue else dFalse- v -> error "TODO: evaluatePrimOp{Less}"+ _ -> error "TODO: evaluatePrimOp{Less}" evaluatePrimOp (NatPow _) (e1 :* e2 :* End) env = case evaluate e2 env of VNat v2 ->- let v2' = fromNat v2 in+ let v2' = fromNatural v2 in case evaluate e1 env of VNat v1 -> VNat (v1 ^ v2') VInt v1 -> VInt (v1 ^ v2') VProb v1 -> VProb (v1 ^ v2') VReal v1 -> VReal (v1 ^ v2')- v2 -> case v2 of {}+ _ -> error "NatPow should always return some kind of number" evaluatePrimOp (Negate _) (e1 :* End) env = case evaluate e1 env of VInt v -> VInt (negate v)@@ -361,7 +366,7 @@ v -> case v of {} evaluatePrimOp (Abs _) (e1 :* End) env = case evaluate e1 env of- VInt v -> VNat . unsafeNat $ abs v+ VInt v -> VNat . unsafeNatural $ abs v VReal v -> VProb . LF.logFloat $ abs v v -> case v of {} evaluatePrimOp (Recip _) (e1 :* End) env = @@ -374,6 +379,10 @@ (VProb v1, VNat v2) -> VProb $ LF.pow v1 (recip . fromIntegral $ v2) v -> case v of {} +evaluatePrimOp (Floor) (e1 :* End) env =+ case (evaluate e1 env) of+ VProb v1 -> VNat (floor (LF.fromLogFloat v1))+ evaluatePrimOp prim _ _ = error ("TODO: evaluatePrimOp{" ++ show prim ++ "}") @@ -387,20 +396,17 @@ -> Value a evaluateArrayOp (Index _) = \(e1 :* e2 :* End) env -> case (evaluate e1 env, evaluate e2 env) of- (VArray v, VNat n) -> v V.! fromNat n- _ -> error "evaluateArrayOp: the impossible happened"+ (VArray v, VNat n) -> v V.! unsafeInt n evaluateArrayOp (Size _) = \(e1 :* End) env -> case evaluate e1 env of- VArray v -> VNat . unsafeNat $ V.length v- _ -> error "evaluateArrayOp: the impossible happened"+ VArray v -> VNat . intToNatural $ V.length v evaluateArrayOp (Reduce _) = \(e1 :* e2 :* e3 :* End) env -> case ( evaluate e1 env , evaluate e2 env , evaluate e3 env) of (f, a, VArray v) -> V.foldl' (lam2 f) a v- _ -> error "evaluateArrayOp: the impossible happened" evaluateMeasureOp :: ( ABT Term abt@@ -411,22 +417,42 @@ -> Env -> Value ('HMeasure a) -evaluateMeasureOp Lebesgue = \End _ ->- VMeasure $ \(VProb p) g -> do- (u,b) <- MWC.uniform g- let l = log u- let n = -l- return $ Just- ( VReal $ if b then n else l- , VProb $ p * 2 * LF.logToLogFloat n- )+evaluateMeasureOp Lebesgue = \(e1 :* e2 :* End) env ->+ case (evaluate e1 env, evaluate e2 env) of+ (VReal v1, VReal v2) | v1 < v2 ->+ VMeasure $ \(VProb p) g ->+ case (isInfinite v1, isInfinite v2) of+ (False, False) -> do+ x <- MWC.uniformR (v1, v2) g+ return $ Just (VReal $ x,+ VProb $ p * LF.logFloat (v2 - v1))+ (False, True) -> do+ u <- MWC.uniform g+ let l = log u+ let n = -l+ return $ Just (VReal $ v1 + n,+ VProb $ p * LF.logToLogFloat n)+ (True, False) -> do+ u <- MWC.uniform g+ let l = log u+ let n = -l+ return $ Just (VReal $ v2 - n,+ VProb $ p * LF.logToLogFloat n)+ (True, True) -> do+ (u,b) <- MWC.uniform g+ let l = log u+ let n = -l+ return $ Just (VReal $ if b then n else l,+ VProb $ p * 2 * LF.logToLogFloat n)+ (VReal _, VReal _) -> error "Lebesgue with length 0 or flipped endpoints" evaluateMeasureOp Counting = \End _ -> VMeasure $ \(VProb p) g -> do let success = LF.logToLogFloat (-3 :: Double) let pow x y = LF.logToLogFloat (LF.logFromLogFloat x * (fromIntegral y :: Double))- u <- MWCD.geometric0 (LF.fromLogFloat success) g+ u' <- MWCD.geometric0 (LF.fromLogFloat success) g+ let u = toInteger u' b <- MWC.uniform g return $ Just ( VInt $ if b then -1-u else u@@ -441,7 +467,7 @@ u <- MWC.uniformR (0, y) g return $ Just ( VNat- . unsafeNat+ . intToNatural . fromMaybe 0 . V.findIndex (u <=) . V.scanl1' (+)@@ -453,35 +479,30 @@ (VReal v1, VReal v2) -> VMeasure $ \p g -> do x <- MWC.uniformR (v1, v2) g return $ Just (VReal x, p)- _ -> error "evaluateMeasureOp: the impossible happened" evaluateMeasureOp Normal = \(e1 :* e2 :* End) env -> case (evaluate e1 env, evaluate e2 env) of (VReal v1, VProb v2) -> VMeasure $ \ p g -> do x <- MWCD.normal v1 (LF.fromLogFloat v2) g return $ Just (VReal x, p)- _ -> error "evaluateMeasureOp: the impossible happened" evaluateMeasureOp Poisson = \(e1 :* End) env -> case evaluate e1 env of VProb v1 -> VMeasure $ \ p g -> do- x <- poisson_rng (LF.fromLogFloat v1) g- return $ Just (VNat $ unsafeNat x, p)- _ -> error "evaluateMeasureOp: the impossible happened"+ x <- MWC.genFromTable (MWC.tablePoisson (LF.fromLogFloat v1)) g+ return $ Just (VNat $ intToNatural x, p) evaluateMeasureOp Gamma = \(e1 :* e2 :* End) env -> case (evaluate e1 env, evaluate e2 env) of (VProb v1, VProb v2) -> VMeasure $ \ p g -> do x <- MWCD.gamma (LF.fromLogFloat v1) (LF.fromLogFloat v2) g return $ Just (VProb $ LF.logFloat x, p)- _ -> error "evaluateMeasureOp: the impossible happened" evaluateMeasureOp Beta = \(e1 :* e2 :* End) env -> case (evaluate e1 env, evaluate e2 env) of (VProb v1, VProb v2) -> VMeasure $ \ p g -> do x <- MWCD.beta (LF.fromLogFloat v1) (LF.fromLogFloat v2) g return $ Just (VProb $ LF.logFloat x, p)- _ -> error "evaluateMeasureOp: the impossible happened" evaluateNaryOp :: (ABT Term abt)@@ -503,6 +524,7 @@ identityElement (Max HOrd_Real) = VReal LF.negativeInfinity identityElement (Min HOrd_Prob) = VProb (LF.logFloat LF.infinity) identityElement (Min HOrd_Real) = VReal LF.infinity+identityElement _ = error "Missing identity elements?" evalOp@@ -550,8 +572,8 @@ evaluateArray n e env = case evaluate n env of VNat n' -> caseBind e $ \x e' ->- VArray $ V.generate (fromNat n') $ \v ->- let v' = VNat $ unsafeNat v in+ VArray $ V.generate (unsafeInt n') $ \v ->+ let v' = VNat $ intToNatural v in evaluate e' (updateEnv (EAssoc x v') env) evaluateBucket@@ -567,7 +589,6 @@ s' <- init Nil1 rs env mapM_ (\i -> accum (VNat i) Nil1 rs s' env) [b' .. e' - 1] done s'- v2 -> case v2 of {} where init :: (ABT Term abt) => List1 Value xs -> Reducer abt xs a@@ -575,15 +596,15 @@ -> ST s (VReducer s a) init ix (Red_Fanout r1 r2) env = VRed_Pair (type_ r1) (type_ r2) <$> init ix r1 env <*> init ix r2 env- init ix (Red_Index n _ mr) env =+ init ix (Red_Index n _ mr) env' = let (vars, n') = caseBinds n in- case evaluate n' (updateEnvs vars ix env) of+ case evaluate n' (updateEnvs vars ix env') of VNat n'' -> VRed_Array <$> V.generateM (fromIntegral n'')- (\b -> init (Cons1 (vnat b) ix) mr env)- init ix (Red_Split _ r1 r2) env =- VRed_Pair (type_ r1) (type_ r2) <$> init ix r1 env <*> init ix r2 env- init ix Red_Nop env = return VRed_Unit- init ix (Red_Add h _) env = VRed_Num <$> newSTRef (identityElement (Sum h))+ (\bb -> init (Cons1 (vnat bb) ix) mr env')+ init ix (Red_Split _ r1 r2) env' =+ VRed_Pair (type_ r1) (type_ r2) <$> init ix r1 env <*> init ix r2 env'+ init _ Red_Nop _ = return VRed_Unit+ init _ (Red_Add h _) _ = VRed_Num <$> newSTRef (identityElement (Sum h)) type_ = typeOfReducer @@ -597,31 +618,32 @@ -> VReducer s a -> Env -> ST s ()- accum n ix (Red_Fanout r1 r2) (VRed_Pair s1 s2 v1 v2) env =- accum n ix r1 v1 env >> accum n ix r2 v2 env- accum n ix (Red_Index n' a1 r2) (VRed_Array v) env =+ accum n ix (Red_Fanout r1 r2) (VRed_Pair _ _ v1 v2) env' =+ accum n ix r1 v1 env >> accum n ix r2 v2 env'+ accum n ix (Red_Index n' a1 r2) (VRed_Array v) env' = caseBind a1 $ \i a1' -> let (vars, a1'') = caseBinds a1' VNat ov = evaluate a1''- (updateEnv (EAssoc i n) (updateEnvs vars ix env))+ (updateEnv (EAssoc i n) (updateEnvs vars ix env')) ov' = fromIntegral ov in accum n (Cons1 (VNat ov) ix) r2 (v V.! ov') env- accum n ix (Red_Split b r1 r2) (VRed_Pair s1 s2 v1 v2) env =- caseBind b $ \i b' ->+ accum n ix (Red_Split bb r1 r2) (VRed_Pair _ _ v1 v2) env' =+ caseBind bb $ \i b' -> let (vars, b'') = caseBinds b' in case evaluate b''- (updateEnv (EAssoc i n) (updateEnvs vars ix env)) of- VDatum b' -> if b' == dTrue then- accum n ix r1 v1 env+ (updateEnv (EAssoc i n) (updateEnvs vars ix env')) of+ VDatum bb -> if bb == dTrue then+ accum n ix r1 v1 env' else- accum n ix r2 v2 env- accum n ix (Red_Add h e) (VRed_Num s) env =- caseBind e $ \i e' ->+ accum n ix r2 v2 env'+ accum n ix (Red_Add h ee) (VRed_Num s) env' =+ caseBind ee $ \i e' -> let (vars, e'') = caseBinds e' v = evaluate e''- (updateEnv (EAssoc i n) (updateEnvs vars ix env)) in+ (updateEnv (EAssoc i n) (updateEnvs vars ix env')) in modifySTRef' s (evalOp (Sum h) v) accum _ _ Red_Nop _ _ = return ()+ accum _ _ _ _ _ = error "Some impossible combinations happened?" done :: VReducer s a -> ST s (Value a) done (VRed_Num s) = readSTRef s@@ -690,4 +712,11 @@ [] -> m' (VProb $ p * x * LF.logFloat y) g ----------------------------------------------------------------++-- Useful 'short-hand'+intToNatural :: Int -> Natural+intToNatural = unsafeNatural . toInteger++unsafeInt :: Natural -> Int+unsafeInt = fromInteger . fromNatural ----------------------------------------------------------- fin.
haskell/Language/Hakaru/Simplify.hs view
@@ -25,14 +25,15 @@ -- Take strings from Maple and interpret them in Haskell (Hakaru) ---------------------------------------------------------------- module Language.Hakaru.Simplify- ( simplify+ ( simplify, simplifyWithOpts+ , simplify' , simplifyDebug ) where import Language.Hakaru.Syntax.ABT import Language.Hakaru.Syntax.AST-import Language.Hakaru.Syntax.Command import Language.Hakaru.Maple +import Language.Hakaru.Syntax.TypeCheck ---------------------------------------------------------------- @@ -40,8 +41,20 @@ :: forall abt a . (ABT Term abt) => abt '[] a -> IO (abt '[] a)-simplify = sendToMaple defaultMapleOptions{command=Simplify}+simplify = simplifyWithOpts defaultMapleOptions +simplifyWithOpts+ :: forall abt a+ . (ABT Term abt) + => MapleOptions () -> abt '[] a -> IO (abt '[] a)+simplifyWithOpts o = sendToMaple o{command=MapleCommand Simplify}++simplify'+ :: forall abt a+ . (ABT Term (abt Term)) + => TypedAST (abt Term) -> IO (TypedAST (abt Term))+simplify' = sendToMaple' defaultMapleOptions{command="Simplify"}+ simplifyDebug :: forall abt a . (ABT Term abt) @@ -49,7 +62,9 @@ -> Int -> abt '[] a -> IO (abt '[] a)-simplifyDebug d t = sendToMaple defaultMapleOptions{command=Simplify,debug=d,timelimit=t}+simplifyDebug d t = sendToMaple+ defaultMapleOptions{command=MapleCommand Simplify,+ debug=d,timelimit=t} ---------------------------------------------------------------- ----------------------------------------------------------- fin.
haskell/Language/Hakaru/Summary.hs view
@@ -31,7 +31,6 @@ import Language.Hakaru.Syntax.ABT import Language.Hakaru.Syntax.AST-import Language.Hakaru.Syntax.Command import Language.Hakaru.Maple ----------------------------------------------------------------@@ -40,13 +39,15 @@ :: forall abt a . (ABT Term abt) => abt '[] a -> IO (abt '[] a)-summary = sendToMaple defaultMapleOptions{command=Summarize}+summary = sendToMaple defaultMapleOptions{command=MapleCommand Summarize} summaryDebug :: forall abt a . (ABT Term abt) => Bool -> abt '[] a -> IO (abt '[] a)-summaryDebug d = sendToMaple defaultMapleOptions{command=Summarize,debug=d}+summaryDebug d = sendToMaple+ defaultMapleOptions{command=MapleCommand Summarize,+ debug=d} ---------------------------------------------------------------- ----------------------------------------------------------- fin.
haskell/Language/Hakaru/Syntax/ABT.hs view
@@ -72,6 +72,7 @@ , cataABT , cataABTM , paraABT+ , dupABT -- * Some ABT instances , TrivialABT()@@ -80,16 +81,13 @@ ) where import Data.Text (Text, empty)---import qualified Data.IntMap as IM import qualified Data.Foldable as F #if __GLASGOW_HASKELL__ < 710 import Control.Applicative hiding (empty) import Data.Monoid (Monoid(..)) #endif -import Control.Monad import Control.Monad.Identity -import Control.Monad.Fix import Data.Number.Nat import Language.Hakaru.Syntax.IClasses -- TODO: factor the definition of the 'Sing' type family out from@@ -167,8 +165,8 @@ instance Foldable12 View where foldMap12 f (Syn t) = f t- foldMap12 f (Var x) = mempty- foldMap12 f (Bind x e) = foldMap12 f e+ foldMap12 _ (Var _) = mempty+ foldMap12 f (Bind _ e) = foldMap12 f e instance Traversable12 View where traverse12 f (Syn t) = Syn <$> f t@@ -690,6 +688,7 @@ -- | If the variable is in the set, then construct a new one which -- isn't (but keeping the same hint and type as the old variable). -- If it isn't in the set, then just return it.+-- FIXME: this is actually not used! freshen :: (JmEq1 (Sing :: k -> *), Show1 (Sing :: k -> *)) => Variable (a :: k)@@ -796,7 +795,7 @@ loop :: forall xs' b' . Nat -> abt xs' b' -> View (syn abt) xs' b' -> m (abt xs' b') loop n _ (Syn t) = syn <$> traverse21 (start n) t- loop _ f (Var z) =+ loop _ _ (Var z) = #ifdef __TRACE_DISINTEGRATE__ trace ("checking varEq " ++ show (varID x) ++ " " ++ show (varID z)) $ #endif @@ -959,11 +958,11 @@ -> (abt '[] a -> m (abt xs b)) -> m (abt (a ': xs) b) binderM hint typ hoas = do- (var, body) <- mfix $ \ ~(_, b) -> do+ (var', body) <- mfix $ \ ~(_, b) -> do let v = Variable hint (nextBind b) typ b' <- hoas (var v) return (v, b')- return (bind var body)+ return (bind var' body) class (ABT syn abt) => Binders syn abt xs as | abt -> syn, abt xs -> as, abt as -> xs where@@ -1129,6 +1128,16 @@ case lookupAssoc x xs of Just e' -> resolveVar e' xs Nothing -> Left x++----------------------------------------------------------------+----------------------------------------------------------------++-- | Makes a copy of an ABT at another type+dupABT+ :: (ABT syn abt0, ABT syn abt1, Functor21 syn)+ => abt0 xs a+ -> abt1 xs a+dupABT = cataABT var bind syn ---------------------------------------------------------------- ----------------------------------------------------------- fin.
haskell/Language/Hakaru/Syntax/AST.hs view
@@ -8,6 +8,8 @@ , FlexibleContexts , UndecidableInstances , Rank2Types+ , DeriveDataTypeable+ , LambdaCase #-} {-# OPTIONS_GHC -Wall -fwarn-tabs #-}@@ -40,8 +42,10 @@ SCon(..) , SArgs(..) , Term(..)+ , Transform(..), TransformImpl(..)+ -- allTransforms, transformName comes from Transform -- * Operators- , LC, LCs, UnLCs+ , LCs, UnLCs -- LC comes from SArgs , LC_(..) , NaryOp(..) , PrimOp(..)@@ -53,6 +57,8 @@ -- * implementation details , foldMapPairs , traversePairs+ , module Language.Hakaru.Syntax.SArgs+ , module Language.Hakaru.Syntax.Transform ) where import Data.Sequence (Seq)@@ -67,6 +73,8 @@ import Control.Arrow ((***)) import Data.Ratio (numerator, denominator) +import Data.Data ()+ import Data.Number.Natural import Language.Hakaru.Syntax.IClasses import Language.Hakaru.Types.DataKind@@ -77,6 +85,9 @@ import Language.Hakaru.Syntax.Reducer import Language.Hakaru.Syntax.ABT (ABT(syn)) +import Language.Hakaru.Syntax.SArgs+import Language.Hakaru.Syntax.Transform+ ---------------------------------------------------------------- ---------------------------------------------------------------- -- BUG: can't UNPACK 'Integer' and 'Natural' like we can for 'Int' and 'Nat'@@ -105,7 +116,8 @@ eq1 (LInt x) (LInt y) = x == y eq1 (LProb x) (LProb y) = x == y eq1 (LReal x) (LReal y) = x == y- eq1 _ _ = False+ -- Because of GADTs, the following is apparently redundant+ -- eq1 _ _ = False instance Eq (Literal a) where (==) = eq1@@ -245,10 +257,6 @@ ---------------------------------------------------------------- -- TODO: should we define our own datakind for @([Hakaru], Hakaru)@ or perhaps for the @/\a -> ([a], Hakaru)@ part of it? --- | Locally closed values (i.e., not binding forms) of a given type.--- TODO: come up with a better name-type LC (a :: Hakaru) = '( '[], a )- -- BUG: how to declare that these are inverses? type family LCs (xs :: [Hakaru]) :: [([Hakaru], Hakaru)] where LCs '[] = '[]@@ -327,6 +335,7 @@ -- TODO: may need @SafeFrom_@ in order to branch on the input -- in order to provide the old unsafe behavior. RealPow :: PrimOp '[ 'HProb, 'HReal ] 'HProb+ Choose :: PrimOp '[ 'HNat, 'HNat ] 'HNat -- ComplexPow :: PrimOp '[ 'HProb, 'HComplex ] 'HComplex -- is uniquely well-defined. Though we may want to implement -- it via @r**z = ComplexExp (z * RealLog r)@@@ -362,7 +371,6 @@ -- when the power is even? N.B., be sure not to actually constrain -- it to HRing (necessary for calling it \"NonNegative\") - -- -- HRing operators -- TODO: break these apart into a hierarchy of classes. N.B, -- there are two different interpretations of "abs" and "signum".@@ -401,6 +409,10 @@ -- do not have all units and thus do not support signum\/normalize? + -- Coecion-like operations that are computations+ -- we only implement Floor for Prob for now?+ Floor :: PrimOp '[ 'HProb ] 'HNat+ -- -- HFractional operators Recip :: !(HFractional a) -> PrimOp '[ a ] a -- generates macro: IntPow@@ -531,7 +543,7 @@ -- valid primitive measures. However, there are many other -- restrictions on measures we may want to consider, so handling -- these two here would only complicate matters.- Lebesgue :: MeasureOp '[] 'HReal+ Lebesgue :: MeasureOp '[ 'HReal, 'HReal ] 'HReal Counting :: MeasureOp '[] 'HInt Categorical :: MeasureOp '[ 'HArray 'HProb ] 'HNat -- TODO: make Uniform polymorphic, so that if the two inputs@@ -575,9 +587,7 @@ -- N.B., the precedence of (:$) must be lower than (:*). -- N.B., if these are changed, then be sure to update the Show instances infix 4 :$ -- Chosen to be at the same precedence as (<$>) rather than ($)-infixr 5 :* -- Chosen to match (:) - -- | The constructor of a @(':$')@ node in the 'Term'. Each of these -- constructors denotes a \"normal\/standard\/basic\" syntactic -- form (i.e., a generalized quantifier). In the literature, these@@ -678,81 +688,13 @@ -> HSemiring b -> SCon '[ LC a, LC a, '( '[ a ], b) ] b - -- -- Internalized program transformations- -- TODO: do these belong in their own place?- --- -- We generally want to evaluate these away at compile-time,- -- but sometimes we may be stuck with a few unresolved things- -- for open terms.-- -- TODO: did we want the singleton @a@ argument back?- Expect :: SCon '[ LC ('HMeasure a), '( '[ a ], 'HProb) ] 'HProb-- -- TODO: implement a \"change of variables\" program transformation- -- to map, say, @Lam_ x. blah (Expect x)@ into @Lam x'. blah x'@.- -- Or, perhaps rather, transform it into @Lam_ x. App_ (Lam_ x'. blah x') (Expect x)@.-- -- TODO: add the four ops for disintegration- Observe :: SCon '[ LC ('HMeasure a), LC a ] ('HMeasure a)-+ -- Internalized program transformations+ Transform_ :: !(Transform as x)+ -> SCon as x deriving instance Eq (SCon args a) -- TODO: instance Read (SCon args a) deriving instance Show (SCon args a)---------------------------------------------------------------------- TODO: ideally we'd like to make SArgs totally flat, like tuples and arrays. Is there a way to do that with data families?--- TODO: is there any good way to reuse 'List1' instead of defining 'SArgs' (aka @List2@)?---- TODO: come up with a better name for 'End'--- TODO: unify this with 'List1'? However, strictness differences...------ | The arguments to a @(':$')@ node in the 'Term'; that is, a list--- of ASTs, where the whole list is indexed by a (type-level) list--- of the indices of each element.-data SArgs :: ([Hakaru] -> Hakaru -> *) -> [([Hakaru], Hakaru)] -> *- where- End :: SArgs abt '[]- (:*) :: !(abt vars a)- -> !(SArgs abt args)- -> SArgs abt ( '(vars, a) ': args)---- TODO: instance Read (SArgs abt args)--instance Show2 abt => Show1 (SArgs abt) where- showsPrec1 _ End = showString "End"- showsPrec1 p (e :* es) =- showParen (p > 5)- ( showsPrec2 (p+1) e- . showString " :* "- . showsPrec1 (p+1) es- )--instance Show2 abt => Show (SArgs abt args) where- showsPrec = showsPrec1- show = show1--instance Eq2 abt => Eq1 (SArgs abt) where- eq1 End End = True- eq1 (x :* xs) (y :* ys) = eq2 x y && eq1 xs ys- eq1 _ _ = False--instance Eq2 abt => Eq (SArgs abt args) where- (==) = eq1--instance Functor21 SArgs where- fmap21 f (e :* es) = f e :* fmap21 f es- fmap21 _ End = End--instance Foldable21 SArgs where- foldMap21 f (e :* es) = f e `mappend` foldMap21 f es- foldMap21 _ End = mempty--instance Traversable21 SArgs where- traverse21 f (e :* es) = (:*) <$> f e <*> traverse21 f es- traverse21 _ End = pure End- ---------------------------------------------------------------- -- | The generating functor for Hakaru ASTs. This type is given in
haskell/Language/Hakaru/Syntax/AST/Eq.hs view
@@ -14,7 +14,7 @@ -- (and\/or: for the various op types, it's okay to move them to -- AST.hs to avoid orphanage. It's just the instances for 'Term' -- itself which are morally suspect outside of testing.)-{-# OPTIONS_GHC -Wall -fwarn-tabs -fno-warn-orphans #-}+{-# OPTIONS_GHC -Wall -fwarn-tabs -fno-warn-orphans -fno-warn-name-shadowing #-} ---------------------------------------------------------------- -- 2016.05.24 -- |@@ -128,25 +128,39 @@ Refl <- jmEq1 (sing_HSemiring h2) (sing_HSemiring h2') Refl <- jmEq1 es es' Just (Refl, Refl)-jmEq_S (Product h1 h2) es (Product h1' h2') es' = do- Refl <- jmEq1 (sing_HDiscrete h1) (sing_HDiscrete h1')- Refl <- jmEq1 (sing_HSemiring h2) (sing_HSemiring h2')+jmEq_S (Transform_ t0) es (Transform_ t1) es' = do Refl <- jmEq1 es es'+ Refl <- jmEq_Transform t0 t1 Just (Refl, Refl)-jmEq_S Expect es Expect es' =- jmEq1 es es' >>= \Refl -> Just (Refl, Refl) jmEq_S _ _ _ _ = Nothing +jmEq_Transform+ :: Transform args a+ -> Transform args a'+ -> Maybe (TypeEq a a')+jmEq_Transform t0 t1 =+ case (t0, t1) of+ (Expect , Expect ) -> Just Refl+ (Observe , Observe ) -> Just Refl+ (MH , MH ) -> Just Refl+ (MCMC , MCMC ) -> Just Refl+ (Disint k0, Disint k1) ->+ if k0==k1 then Just Refl else Nothing+ (Summarize, Summarize) -> Just Refl+ (Simplify , Simplify ) -> Just Refl+ (Reparam , Reparam ) -> Just Refl+ _ -> Nothing+ -- TODO: Handle jmEq2 of pat and pat' jmEq_Branch :: (ABT Term abt, JmEq2 abt) => [(Branch a abt b, Branch a abt b')] -> Maybe (TypeEq b b') jmEq_Branch [] = Nothing-jmEq_Branch [(Branch pat e, Branch pat' e')] = do+jmEq_Branch [(Branch _ e, Branch _ e')] = do (Refl, Refl) <- jmEq2 e e' return Refl-jmEq_Branch ((Branch pat e, Branch pat' e'):es) = do+jmEq_Branch ((Branch _ e, Branch _ e'):es) = do (Refl, Refl) <- jmEq2 e e' jmEq_Branch es @@ -307,10 +321,10 @@ alphaEq- :: forall abt a+ :: forall abt d . (ABT Term abt)- => abt '[] a- -> abt '[] a+ => abt '[] d+ -> abt '[] d -> Bool alphaEq e1 e2 = maybe False (const True)@@ -380,7 +394,6 @@ sArgsEq (e1 :* es1) (e2 :* es2) = do go (viewABT e1) (viewABT e2) sArgsEq es1 es2- sArgsEq _ _ = lift Nothing sConEq :: forall a args1 args2@@ -446,19 +459,37 @@ Refl <- lift $ jmEq1 (sing_HSemiring h2) (sing_HSemiring h2') sArgsEq e1 e2 - sConEq (Product h1 h2) e1 (Product h1' h2') e2 = do- Refl <- lift $ jmEq1 (sing_HDiscrete h1) (sing_HDiscrete h1')- Refl <- lift $ jmEq1 (sing_HSemiring h2) (sing_HSemiring h2')- sArgsEq e1 e2-- sConEq Expect (e1 :* e2 :* End)- Expect (e1' :* e2' :* End) = do- Refl <- lift $ jmEq1 (typeOf e1) (typeOf e1')- go (viewABT e1) (viewABT e1')- go (viewABT e2) (viewABT e2')+ sConEq (Transform_ t1) e1+ (Transform_ t2) e2 = transformEq t1 e1 t2 e2 sConEq _ _ _ _ = lift Nothing + transformEq+ :: Transform args1 a1+ -> SArgs abt args1+ -> Transform args2 a1+ -> SArgs abt args2+ -> ReaderT Varmap Maybe ()+ transformEq t0 e0 t1 e1 =+ case (t0, t1) of+ -- Special case needed because some type variables in the input do not+ -- appear in the output+ (Expect , Expect ) ->+ case (e0, e1) of+ (e1 :* e2 :* End,+ e1' :* e2' :* End) -> do+ Refl <- lift $ jmEq1 (typeOf e1) (typeOf e1')+ go (viewABT e1) (viewABT e1')+ go (viewABT e2) (viewABT e2')+ (Observe , Observe ) -> sArgsEq e0 e1+ (MH , MH ) -> sArgsEq e0 e1+ (MCMC , MCMC ) -> sArgsEq e0 e1+ (Disint k0, Disint k1) ->+ if k0==k1 then sArgsEq e0 e1 else lift Nothing+ (Summarize, Summarize) -> sArgsEq e0 e1+ (Simplify , Simplify ) -> sArgsEq e0 e1+ (Reparam , Reparam ) -> sArgsEq e0 e1+ _ -> lift Nothing primOpEq :: forall a typs1 typs2 args1 args2@@ -467,9 +498,9 @@ => PrimOp typs1 a -> SArgs abt args1 -> PrimOp typs2 a -> SArgs abt args2 -> ReaderT Varmap Maybe ()- primOpEq p1 e1 p2 e2 = do+ primOpEq p1 e1' p2 e2' = do (Refl, Refl) <- lift $ jmEq2 p1 p2- sArgsEq e1 e2+ sArgsEq e1' e2' arrayOpEq :: forall a typs1 typs2 args1 args2@@ -489,9 +520,9 @@ => MeasureOp typs1 a -> SArgs abt args1 -> MeasureOp typs2 a -> SArgs abt args2 -> ReaderT Varmap Maybe ()- measureOpEq m1 e1 m2 e2 = do+ measureOpEq m1 e1' m2 e2' = do (Refl,Refl) <- lift $ jmEq2 m1 m2- sArgsEq e1 e2+ sArgsEq e1' e2' datumEq :: forall a . Datum (abt '[]) a@@ -517,7 +548,6 @@ datumFunEq c1 d1 datumStructEq c2 d2 datumStructEq Done Done = return ()- datumStructEq _ _ = lift Nothing datumFunEq :: forall x a@@ -526,23 +556,22 @@ -> ReaderT Varmap Maybe () datumFunEq (Konst e) (Konst f) = go (viewABT e) (viewABT f) datumFunEq (Ident e) (Ident f) = go (viewABT e) (viewABT f) - datumFunEq _ _ = lift Nothing pairEq- :: forall a b- . (abt '[] a, abt '[] b)- -> (abt '[] a, abt '[] b)+ :: forall c b+ . (abt '[] c, abt '[] b)+ -> (abt '[] c, abt '[] b) -> ReaderT Varmap Maybe () pairEq (x1, y1) (x2, y2) = do go (viewABT x1) (viewABT x2) go (viewABT y1) (viewABT y2) sBranch- :: forall a b- . Branch a abt b- -> Branch a abt b+ :: forall c b+ . Branch c abt b+ -> Branch c abt b -> ReaderT Varmap Maybe ()- sBranch (Branch p1 e1) (Branch p2 e2) = patternEq p1 p2 >> go (viewABT e1) (viewABT e2)+ sBranch (Branch p3 e3) (Branch p4 e4) = patternEq p3 p4 >> go (viewABT e3) (viewABT e4) patternEq :: Pattern a0 b0@@ -580,9 +609,9 @@ pdatumFunEq _ _ = lift Nothing reducerEq- :: forall xs a- . Reducer abt xs a- -> Reducer abt xs a+ :: forall xs b+ . Reducer abt xs b+ -> Reducer abt xs b -> ReaderT Varmap Maybe () reducerEq (Red_Fanout r s) (Red_Fanout r' s') = do reducerEq r r'
haskell/Language/Hakaru/Syntax/AST/Sing.hs view
@@ -72,8 +72,10 @@ sing_PrimOp Acosh = (sing `Cons1` Nil1, sing) sing_PrimOp Atanh = (sing `Cons1` Nil1, sing) sing_PrimOp RealPow = (sing `Cons1` sing `Cons1` Nil1, sing)+sing_PrimOp Choose = (sing `Cons1` sing `Cons1` Nil1, sing) sing_PrimOp Exp = (sing `Cons1` Nil1, sing) sing_PrimOp Log = (sing `Cons1` Nil1, sing)+sing_PrimOp Floor = (sing `Cons1` Nil1, sing) sing_PrimOp (Infinity h) = (Nil1, sing_HIntegrable h) sing_PrimOp GammaFunc = (sing `Cons1` Nil1, sing) sing_PrimOp BetaFunc = (sing `Cons1` sing `Cons1` Nil1, sing)@@ -121,7 +123,7 @@ sing_MeasureOp :: MeasureOp typs a -> (List1 Sing typs, Sing a)-sing_MeasureOp Lebesgue = (Nil1, sing)+sing_MeasureOp Lebesgue = (sing `Cons1` sing `Cons1` Nil1, sing) sing_MeasureOp Counting = (Nil1, sing) sing_MeasureOp Categorical = (sing `Cons1` Nil1, sing) sing_MeasureOp Uniform = (sing `Cons1` sing `Cons1` Nil1, sing)
haskell/Language/Hakaru/Syntax/AST/Transforms.hs view
@@ -1,9 +1,10 @@ {-# LANGUAGE FlexibleContexts , GADTs- , Rank2Types , ScopedTypeVariables , DataKinds , TypeOperators+ , OverloadedStrings+ , LambdaCase #-} {-# OPTIONS_GHC -Wall -fwarn-tabs #-}@@ -21,11 +22,37 @@ import Language.Hakaru.Syntax.AST import Language.Hakaru.Syntax.TypeOf import Language.Hakaru.Syntax.IClasses+import Language.Hakaru.Syntax.Prelude (lamWithVar, app) import Language.Hakaru.Types.DataKind -import Language.Hakaru.Expect (expect)-import Language.Hakaru.Disintegrate (determine, observe)+import Language.Hakaru.Expect (expectInCtx, determineExpect)+import Language.Hakaru.Disintegrate (determine, observeInCtx, disintegrateInCtx)+import Language.Hakaru.Inference (mcmc', mh')+import Language.Hakaru.Maple (sendToMaple, MapleOptions(..)+ ,defaultMapleOptions, MapleCommand(..)+ ,MapleException) +import Data.Ratio (numerator, denominator)+import Language.Hakaru.Types.Sing (sing, Sing(..), sUnFun)+import Language.Hakaru.Types.HClasses (HFractional(..))+import Language.Hakaru.Types.Coercion (findCoercion, Coerce(..))+import qualified Data.Sequence as Seq +import Control.Monad.Fix (MonadFix)+import Control.Monad (liftM)+import Control.Monad.Trans (MonadTrans(..))+import Control.Monad.State (StateT(..), evalStateT, put, get, withStateT)+import Control.Applicative (Applicative(..), Alternative(..), (<$>), (<$))+import Data.Functor.Identity (Identity(..))++import Control.Exception (try)+import System.IO (stderr)+import Data.Text.Utf8 (hPutStrLn)+import Data.Text (pack)+import Data.Monoid (Monoid(..), (<>))++import Debug.Trace++ optimizations :: (ABT Term abt) => abt '[] a@@ -64,24 +91,175 @@ _ -> error "TODO: underLam" +underLam'+ :: forall abt m a b b'+ . (ABT Term abt, MonadFix m)+ => (abt '[] b -> m (abt '[] b'))+ -> abt '[] (a ':-> b)+ -> m (abt '[] (a ':-> b'))+underLam' f e = do+ f' <- trace "underLam': build function" $+ liftM (\f' b -> app (syn $ Lam_ :$ f' :* End) b) $+ binderM "" (snd $ sUnFun $ typeOf e) f+ return $ underLam'p f' e +underLam'p+ :: forall abt a b b'+ . (ABT Term abt)+ => (abt '[] b -> abt '[] b')+ -> abt '[] (a ':-> b)+ -> abt '[] (a ':-> b')+underLam'p f e =+ let var_ :: Variable (a ':-> b) -> abt '[] (a ':-> b')+ var_ v_ab = trace "underLam': entered var" $+ lamWithVar "" (fst $ sUnFun $ varType v_ab) $ \a ->+ trace "underLam': applied function" $ f $ app (var v_ab) a++ syn_ t = trace "underLam': entered syn" $+ case t of+ Lam_ :$ e1 :* End -> trace "underLam': entered syn/Lam_" $+ caseBind e1 $ \x e1' ->+ trace "underLam': rebuilt Lam_" $+ syn $ Lam_ :$+ (trace "underLam': applied bind{Lam_}" $+ bind x (trace "underLam': applied function{Lam_}"+ $ f e1')) :* End++ Let_ :$ e1 :* e2 :* End -> trace "underLam': entered syn/Lam_" $+ caseBind e2 $ \x e2' ->+ trace "underLam': rebuilt Let_" $+ syn $ Let_ :$ e1 :*+ (trace "underLam': applied bind{Lam_}" $+ bind x (trace "underLam': recursive case{Let_}" $+ go e2')) :* End++ _ -> error "TODO: underLam'"++ go e' = trace "underLam': entered main body" $+ caseVarSyn e' var_ syn_+ in go e++--------------------------------------------------------------------------------+ expandTransformations :: forall abt a . (ABT Term abt) => abt '[] a -> abt '[] a expandTransformations =- cataABT var bind alg- where - alg :: forall b. Term abt b -> abt '[] b- alg t =- case t of- Expect :$ e1 :* e2 :* End -> expect e1 e2- Observe :$ e1 :* e2 :* End ->- case determine (observe e1 e2) of- Just t' -> t'- Nothing -> syn t- _ -> syn t- + expandTransformationsWith' haskellTransformations++expandAllTransformations+ :: forall abt a+ . (ABT Term abt)+ => abt '[] a -> IO (abt '[] a)+expandAllTransformations =+ expandTransformationsWith allTransformations++expandTransformationsWith'+ :: forall abt a+ . (ABT Term abt)+ => TransformTable abt Identity+ -> abt '[] a -> abt '[] a+expandTransformationsWith' tbl =+ runIdentity . expandTransformationsWith tbl++type TransformM = StateT TransformCtx++expandTransformationsWith+ :: forall abt a m+ . (ABT Term abt, Applicative m, Monad m)+ => TransformTable abt m+ -> abt '[] a -> m (abt '[] a)+expandTransformationsWith tbl t0 =+ flip evalStateT (mempty {nextFreeVar = nextFreeOrBind t0}) .+ cataABTM (pure . var) bind_ (>>= syn_) $ t0+ where+ bind_ :: forall x xs b+ . Variable x+ -> TransformM m (abt xs b)+ -> TransformM m (abt (x ': xs) b)+ bind_ v mt = bind v <$> withStateT (ctxOf v <>) mt++ syn_ :: forall b. Term abt b -> TransformM m (abt '[] b)+ syn_ t =+ case t of+ Transform_ tr :$ as ->+ get >>= \ctx ->+ maybe (pure $ syn t)+ (\r -> r <$ put (ctxOf r <> ctx))+ =<< lift (lookupTransform' tbl tr ctx as)+ _ -> pure $ syn t++mapleTransformationsWithOpts+ :: forall abt+ . ABT Term abt+ => MapleOptions ()+ -> TransformTable abt IO+mapleTransformationsWithOpts opts = TransformTable $ \tr ->+ let cmd c ctx x =+ try (sendToMaple opts{command=MapleCommand c+ ,context=ctx} x) >>=+ \case+ Left (err :: MapleException) ->+ hPutStrLn stderr (pack $ show err) >> pure Nothing+ Right r ->+ pure $ Just r+ cmd :: Transform '[LC i] o -> TransformCtx+ -> abt '[] i -> IO (Maybe (abt '[] o)) in+ case tr of+ Simplify ->+ Just $ \ctx -> \case { e1 :* End -> cmd tr ctx e1 }+ Summarize ->+ Just $ \ctx -> \case { e1 :* End -> cmd tr ctx e1 }+ Reparam ->+ Just $ \ctx -> \case { e1 :* End -> cmd tr ctx e1 }+ Disint InMaple ->+ Just $ \ctx -> \case { e1 :* End -> cmd tr ctx e1 }+ _ -> Nothing++mapleTransformations+ :: ABT Term abt+ => TransformTable abt IO+mapleTransformations = mapleTransformationsWithOpts defaultMapleOptions++haskellTransformations :: (Applicative m, ABT Term abt) => TransformTable abt m+haskellTransformations = simpleTable $ \tr ->+ case tr of+ Expect ->+ Just $ \ctx -> \case+ e1 :* e2 :* End -> determineExpect $ expectInCtx ctx e1 e2++ Observe ->+ Just $ \ctx -> \case+ e1 :* e2 :* End -> determine $ observeInCtx ctx e1 e2++ MCMC ->+ Just $ \ctx -> \case+ e1 :* e2 :* End -> mcmc' ctx e1 e2++ MH ->+ Just $ \ctx -> \case+ e1 :* e2 :* End -> mh' ctx e1 e2++ Disint InHaskell ->+ Just $ \ctx -> \case+ e1 :* End -> determine $ disintegrateInCtx ctx e1++ _ -> Nothing++allTransformationsWithMOpts+ :: ABT Term abt+ => MapleOptions ()+ -> TransformTable abt IO+allTransformationsWithMOpts opts = unionTable+ (mapleTransformationsWithOpts opts)+ haskellTransformations++allTransformations :: ABT Term abt => TransformTable abt IO+allTransformations = allTransformationsWithMOpts defaultMapleOptions++--------------------------------------------------------------------------------+ coalesce :: forall abt a . (ABT Term abt)
− haskell/Language/Hakaru/Syntax/Command.hs
@@ -1,80 +0,0 @@-{-# LANGUAGE FlexibleInstances- , GADTs- , DataKinds- , TypeOperators- , ViewPatterns- , KindSignatures- , RankNTypes- , UndecidableInstances - #-}--{-# OPTIONS_GHC -Wall -fwarn-tabs #-}--- |--- Module : Language.Hakaru.Syntax.Command --- Copyright : Copyright (c) 2016 the Hakaru team--- License : BSD3--- Stability : experimental--- Portability : GHC-only------ An encoding of (some) Hakaru commands and their types. ------------------------------------------------------------------module Language.Hakaru.Syntax.Command where - -import Language.Hakaru.Types.Sing-import Language.Hakaru.Types.DataKind-import Language.Hakaru.Syntax.ABT-import Language.Hakaru.Syntax.AST-import Language.Hakaru.Syntax.IClasses-import GHC.TypeLits (Symbol)-import Data.List (isInfixOf)-import Data.Char (toLower)-import Data.Function (on) --------------------------------------------------------------------data CommandType (c :: Symbol) (i :: Hakaru) (o :: Hakaru) where - Simplify :: CommandType "Simplify" a a - DisintMeas :: CommandType "Disintegrate" (HMeasure (HPair a b)) (a :-> HMeasure b)- DisintFun :: !(CommandType "Disintegrate" x x') - -> CommandType "Disintegrate" (a :-> x) (a :-> x') - Summarize :: CommandType "Summarize" a a --commandIsType :: CommandType c i o -> Sing i -> Sing o-commandIsType DisintMeas (SMeasure (sUnPair->(a,b))) = SFun a (SMeasure b)-commandIsType (DisintFun t) (SFun a x) = SFun a (commandIsType t x)-commandIsType Simplify x = x-commandIsType Summarize x = x- -nameOfCommand :: CommandType c i o -> Sing c-nameOfCommand Simplify{} = sing -nameOfCommand Summarize{} = sing -nameOfCommand DisintMeas{} = sing-nameOfCommand DisintFun{} = sing --parseCommand = flip (isInfixOf `on` map toLower)--commandFromName - :: String - -> Sing i - -> (forall o c . Either Bool (CommandType c i o, Sing o) -> k) - -> k-commandFromName (parseCommand "Simplify"->True) i k = k $ Right (Simplify, i)--commandFromName (parseCommand "Disintegrate"->True) i k = - let disint_commandFromType - :: Sing i - -> (forall o . Either Bool (CommandType "Disintegrate" i o, Sing o) -> k) - -> k- disint_commandFromType i k = - case i of - SMeasure (SData (STyApp (STyApp (STyCon (jmEq1 sSymbol_Pair -> Just Refl)) a) b) _) -> - k $ Right (DisintMeas, SFun a (SMeasure b))- SFun a x -> - disint_commandFromType x $ \q -> - k $ fmap (\(c,x') -> (DisintFun c, SFun a x')) q- _ -> k $ Left True- in disint_commandFromType i k --commandFromName (parseCommand "Summarize"->True) i k = k $ Right (Summarize, i)--commandFromName _ _ k = k $ Left False
haskell/Language/Hakaru/Syntax/Datum.hs view
@@ -40,7 +40,7 @@ , DatumStruct(..) , DatumFun(..) -- ** Some smart constructors for the \"built-in\" datatypes- , dTrue, dFalse+ , dTrue, dFalse, dBool , dUnit , dPair , dLeft, dRight@@ -253,7 +253,6 @@ instance Eq1 ast => Eq1 (DatumStruct xs ast) where eq1 (Et c1 c2) (Et d1 d2) = eq1 c1 d1 && eq1 c2 d2 eq1 Done Done = True- eq1 _ _ = False instance Eq1 ast => Eq (DatumStruct xs ast a) where (==) = eq1@@ -305,7 +304,6 @@ instance Eq1 ast => Eq1 (DatumFun x ast) where eq1 (Konst e) (Konst f) = eq1 e f eq1 (Ident e) (Ident f) = eq1 e f- eq1 _ _ = False instance Eq1 ast => Eq (DatumFun x ast a) where (==) = eq1@@ -346,6 +344,9 @@ dTrue = Datum tdTrue sBool . Inl $ Done dFalse = Datum tdFalse sBool . Inr . Inl $ Done +dBool :: Bool -> Datum ast HBool+dBool b = if b then dTrue else dFalse+ dUnit :: Datum ast HUnit dUnit = Datum tdUnit sUnit . Inl $ Done @@ -582,12 +583,10 @@ Refl <- jmEq_PStruct c2 d2 Just Refl jmEq_PStruct PDone PDone = Just Refl-jmEq_PStruct _ _ = Nothing jmEq_PFun :: PDatumFun f vs a -> PDatumFun f ws a -> Maybe (TypeEq vs ws) jmEq_PFun (PKonst p1) (PKonst p2) = jmEq_P p1 p2 jmEq_PFun (PIdent p1) (PIdent p2) = jmEq_P p1 p2-jmEq_PFun _ _ = Nothing #if __PARTIAL_DATUM_JMEQ__@@ -654,7 +653,6 @@ instance Eq2 (PDatumFun x) where eq2 (PKonst e) (PKonst f) = eq2 e f eq2 (PIdent e) (PIdent f) = eq2 e f- eq2 _ _ = False instance Eq1 (PDatumFun x vars) where eq1 = eq2
haskell/Language/Hakaru/Syntax/DatumCase.hs view
@@ -39,6 +39,7 @@ ) where import Data.Proxy (Proxy(..))+import Prelude hiding ((<>)) import Language.Hakaru.Syntax.IClasses -- TODO: make things polykinded so we can make our ABT implementation@@ -306,7 +307,6 @@ PVar -> case vars of Cons1 x vars' -> return . Just $ Matched_ (Assoc x e :) vars'- _ -> error "matchPattern: the impossible happened" PDatum _hint1 pat1 -> do mb <- getDatum e case mb of@@ -351,7 +351,6 @@ matchFun getDatum d1 p1 vars0 `bindMMR` \xs1 vars1 -> matchStruct getDatum d2 p2 vars1 `bindMMR` \xs2 vars2 -> return . Just $ Matched_ (xs1 . xs2) vars2- _ -> return Nothing where -- TODO: just turn @Maybe MatchState@ into a monad already? bindMMR m k = do@@ -372,7 +371,6 @@ case (d,pat) of (Konst d2, PKonst p2) -> matchPattern getDatum d2 p2 vars (Ident d1, PIdent p1) -> matchPattern getDatum d1 p1 vars- _ -> return Nothing ---------------------------------------------------------------- ----------------------------------------------------------- fin.
haskell/Language/Hakaru/Syntax/Hoist.hs view
@@ -43,7 +43,7 @@ module Language.Hakaru.Syntax.Hoist (hoist) where import Control.Applicative (liftA2)-import Control.Monad.RWS+import Control.Monad.RWS hiding ((<>)) import qualified Data.Foldable as F import qualified Data.Graph as G import qualified Data.IntMap.Strict as IM@@ -66,6 +66,10 @@ import Control.Applicative #endif +#if !(MIN_VERSION_base(4,11,0))+import Data.Semigroup+#endif+ data Entry (abt :: Hakaru -> *) = forall (a :: Hakaru) . Entry { varDependencies :: !(VarSet (KindOf a))@@ -152,9 +156,14 @@ -- The general case for generating the entry set for a term is to simply union -- the sets for all the subterms, so we choose union as our monoidal operation -- for the Writer monad.+instance (ABT Term abt) => Semigroup (ExpressionSet abt) where+ (<>) = unionEntrySet+ instance (ABT Term abt) => Monoid (ExpressionSet abt) where mempty = ExpressionSet []- mappend = unionEntrySet+#if !(MIN_VERSION_base(4,11,0))+ mappend = (<>)+#endif -- Given a list of entries to introduce, order them so that their data -- data dependencies are satisified.
haskell/Language/Hakaru/Syntax/IClasses.hs view
@@ -7,6 +7,10 @@ , TypeFamilies , Rank2Types , ScopedTypeVariables+ , ConstraintKinds+ , MultiParamTypeClasses+ , FlexibleInstances+ , UndecidableInstances #-} {-# OPTIONS_GHC -Wall -fwarn-tabs #-} ----------------------------------------------------------------@@ -71,15 +75,20 @@ , Some2(..) , Pair1(..), fst1, snd1 , Pair2(..), fst2, snd2+ , Pointwise(..), PointwiseP(..) -- ** List types , type (++), eqAppendIdentity, eqAppendAssoc , List1(..), append1+ , List2(..) , DList1(..), toList1, fromList1, dnil1, dcons1, dsnoc1, dsingleton1, dappend1+ -- ** Constraints+ , All(..), Holds(..) ) where import Prelude hiding (id, (.)) import Control.Category (Category(..)) import Unsafe.Coerce (unsafeCoerce)+import GHC.Exts (Constraint) #if __GLASGOW_HASKELL__ < 710 import Data.Monoid (Monoid(..)) import Control.Applicative@@ -467,7 +476,6 @@ foldMap12 :: (Monoid m) => (forall i. a i -> m) -> f a j l -> m foldMap12 f = fold12 . fmap12 (Lift1 . f)- class Functor21 f => Foldable21 (f :: (k1 -> k2 -> *) -> k3 -> *) where {-# MINIMAL fold21 | foldMap21 #-}@@ -478,7 +486,6 @@ foldMap21 :: (Monoid m) => (forall h i. a h i -> m) -> f a j -> m foldMap21 f = fold21 . fmap21 (Lift2 . f) - class Functor22 f => Foldable22 (f :: (k1 -> k2 -> *) -> k3 -> k4 -> *) where@@ -490,7 +497,6 @@ foldMap22 :: (Monoid m) => (forall h i. a h i -> m) -> f a j l -> m foldMap22 f = fold22 . fmap22 (Lift2 . f) - ---------------------------------------------------------------- ---------------------------------------------------------------- class Foldable11 t => Traversable11 (t :: (k1 -> *) -> k2 -> *) where@@ -563,7 +569,13 @@ instance Eq a => Eq1 (Lift2 a i) where eq1 (Lift2 a) (Lift2 b) = a == b +----------------------------------------------------------------+data Pointwise (f :: k0 -> *) (g :: k1 -> *) (x :: k0) (y :: k1) where+ Pw :: f x -> g y -> Pointwise f g x y +data PointwiseP (f :: k0 -> *) (g :: k1 -> *) (xy :: (k0, k1)) where+ PwP :: f x -> g y -> PointwiseP f g '(x,y)+ ---------------------------------------------------------------- -- BUG: haddock doesn't like annotations on GADT constructors. So -- here we'll avoid using the GADT syntax, even though it'd make@@ -749,7 +761,6 @@ instance Eq1 a => Eq1 (List1 a) where eq1 Nil1 Nil1 = True eq1 (Cons1 x xs) (Cons1 y ys) = eq1 x y && eq1 xs ys- eq1 _ _ = False instance Eq1 a => Eq (List1 a xs) where (==) = eq1@@ -766,6 +777,22 @@ traverse11 _ Nil1 = pure Nil1 traverse11 f (Cons1 x xs) = Cons1 <$> f x <*> traverse11 f xs +----------------------------------------------------------------+-- | Lifting of relations pointwise to lists+data List2 :: (k0 -> k1 -> *) -> [k0] -> [k1] -> * where+ Nil2 :: List2 f '[] '[]+ Cons2 :: f x y -> List2 f xs ys -> List2 f (x ': xs) (y ': ys)++----------------------------------------------------------------+data Holds (c :: k -> Constraint) (x :: k) where+ Holds :: c x => Holds c x++class All (c :: k -> Constraint) (xs :: [k]) where+ allHolds :: List1 (Holds c) xs++instance All c '[] where allHolds = Nil1+instance (All c xs, c x)+ => All c (x ': xs) where allHolds = Cons1 Holds allHolds ---------------------------------------------------------------- -- TODO: cf the interface of <https://hackage.haskell.org/package/dlist-0.7.1.2/docs/Data-DList.html>
haskell/Language/Hakaru/Syntax/Prelude.hs view
@@ -62,6 +62,10 @@ , negativeInfinity -- *** Trig , sin, cos, tan, asin, acos, atan, sinh, cosh, tanh, asinh, acosh, atanh+ -- Choose+ , choose+ -- *** coercions-that-compute+ , floor -- * Measures -- ** Abstract nonsense@@ -72,7 +76,7 @@ , reject, guard, withGuard -- ** Measure operators -- | When two versions of the same operator are given, the one without the prime builds an AST using the built-in operator, whereas the one with the prime is a default definition in terms of more primitive measure operators.- , lebesgue+ , lebesgue, lebesgue' , counting , densityCategorical, categorical, categorical' , densityUniform, uniform, uniform'@@ -141,7 +145,6 @@ import qualified Data.List.NonEmpty as L import Data.Semigroup (Semigroup(..)) import Control.Category (Category(..))-import Control.Monad (return) import Control.Monad.Fix import Data.Number.Natural@@ -398,7 +401,6 @@ PrimOp_ Not :$ es' -> case es' of e' :* End -> Just e'- _ -> error "not: the impossible happened" NaryOp_ And xs -> Just . syn . NaryOp_ Or $ Prelude.fmap not xs NaryOp_ Or xs ->@@ -522,7 +524,6 @@ PrimOp_ (Negate _theRing) :$ es' -> case es' of e' :* End -> Just e'- _ -> error "negate: the impossible happened" _ -> Nothing @@ -548,7 +549,6 @@ CoerceTo_ (CCons (Signed _theRing) CNil) :$ es' -> case es' of e' :* End -> Just e'- _ -> error "abs_: the impossible happened" _ -> Nothing @@ -582,7 +582,6 @@ PrimOp_ (Recip _theFrac) :$ es' -> case es' of e :* End -> Just e- _ -> error "recip: the impossible happened" _ -> Nothing @@ -717,7 +716,13 @@ acosh = primOp1_ Acosh atanh = primOp1_ Atanh +choose+ :: (ABT Term abt) => abt '[] 'HNat -> abt '[] 'HNat -> abt '[] 'HNat+choose = primOp2_ Choose +floor :: (ABT Term abt) => abt '[] 'HProb -> abt '[] 'HNat+floor = primOp1_ Floor+ ---------------------------------------------------------------- datum_ :: (ABT Term abt)@@ -1262,9 +1267,11 @@ -> abt '[] ('HMeasure c) liftM2 f m n = m >>= \x -> f x <$> n +lebesgue' :: (ABT Term abt) => abt '[] 'HReal -> abt '[] 'HReal -> abt '[] ('HMeasure 'HReal)+lebesgue' = measure2_ Lebesgue lebesgue :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)-lebesgue = measure0_ Lebesgue+lebesgue = lebesgue' negativeInfinity infinity counting :: (ABT Term abt) => abt '[] ('HMeasure 'HInt) counting = measure0_ Counting
haskell/Language/Hakaru/Syntax/Reducer.hs view
@@ -60,7 +60,7 @@ traverse22 f (Red_Fanout r1 r2) = Red_Fanout <$> traverse22 f r1 <*> traverse22 f r2 traverse22 f (Red_Index n ix r) = Red_Index <$> f n <*> f ix <*> traverse22 f r traverse22 f (Red_Split b r1 r2) = Red_Split <$> f b <*> traverse22 f r1 <*> traverse22 f r2- traverse22 f Red_Nop = pure Red_Nop+ traverse22 _ Red_Nop = pure Red_Nop traverse22 f (Red_Add h e) = Red_Add h <$> f e
haskell/Language/Hakaru/Syntax/Rename.hs view
@@ -29,17 +29,9 @@ ---------------------------------------------------------------- module Language.Hakaru.Syntax.Rename where -import Control.Monad.Reader-import Control.Monad.State-import Data.Maybe (fromMaybe)-import Data.Number.Nat- import Language.Hakaru.Syntax.ABT import Language.Hakaru.Syntax.AST-import Language.Hakaru.Syntax.AST.Eq (Varmap)-import Language.Hakaru.Syntax.Gensym import Language.Hakaru.Syntax.IClasses-import Language.Hakaru.Syntax.Variable import qualified Data.Text as Text import Data.Text (Text) import Data.Char
+ haskell/Language/Hakaru/Syntax/SArgs.hs view
@@ -0,0 +1,91 @@+{-# LANGUAGE CPP+ , DataKinds+ , PolyKinds+ , GADTs+ , RankNTypes+ , TypeOperators+ #-}++{-# OPTIONS_GHC -Wall -fwarn-tabs #-}+----------------------------------------------------------------+module Language.Hakaru.Syntax.SArgs+ ( module Language.Hakaru.Syntax.SArgs+ ) where++#if __GLASGOW_HASKELL__ < 710+import Control.Applicative (pure,(<$>),(<*>),Applicative)+import Data.Monoid (Monoid(mempty,mappend))+#endif++import Language.Hakaru.Syntax.IClasses+import Language.Hakaru.Types.DataKind+import Language.Hakaru.Types.Sing+++-- | Locally closed values (i.e., not binding forms) of a given type.+-- TODO: come up with a better name+type LC (a :: Hakaru) = '( '[], a )++----------------------------------------------------------------+-- TODO: ideally we'd like to make SArgs totally flat, like tuples and arrays. Is there a way to do that with data families?+-- TODO: is there any good way to reuse 'List1' instead of defining 'SArgs' (aka @List2@)?++-- TODO: come up with a better name for 'End'+-- TODO: unify this with 'List1'? However, strictness differences...+--+-- | The arguments to a @(':$')@ node in the 'Term'; that is, a list+-- of ASTs, where the whole list is indexed by a (type-level) list+-- of the indices of each element.+data SArgs :: ([Hakaru] -> Hakaru -> *) -> [([Hakaru], Hakaru)] -> *+ where+ End :: SArgs abt '[]+ (:*) :: !(abt vars a)+ -> !(SArgs abt args)+ -> SArgs abt ( '(vars, a) ': args)++infixr 5 :* -- Chosen to match (:)++-- TODO: instance Read (SArgs abt args)++instance Show2 abt => Show1 (SArgs abt) where+ showsPrec1 _ End = showString "End"+ showsPrec1 p (e :* es) =+ showParen (p > 5)+ ( showsPrec2 (p+1) e+ . showString " :* "+ . showsPrec1 (p+1) es+ )++instance Show2 abt => Show (SArgs abt args) where+ showsPrec = showsPrec1+ show = show1++instance Eq2 abt => Eq1 (SArgs abt) where+ eq1 End End = True+ eq1 (x :* xs) (y :* ys) = eq2 x y && eq1 xs ys++instance Eq2 abt => Eq (SArgs abt args) where+ (==) = eq1++instance Functor21 SArgs where+ fmap21 f (e :* es) = f e :* fmap21 f es+ fmap21 _ End = End++instance Foldable21 SArgs where+ foldMap21 f (e :* es) = f e `mappend` foldMap21 f es+ foldMap21 _ End = mempty++instance Traversable21 SArgs where+ traverse21 f (e :* es) = (:*) <$> f e <*> traverse21 f es+ traverse21 _ End = pure End+++type SArgsSing = SArgs (Pointwise (Lift1 ()) Sing)++getSArgsSing+ :: forall abt xs m+ . (Applicative m)+ => (forall ys a . abt ys a -> m (Sing a))+ -> SArgs abt xs+ -> m (SArgsSing xs)+getSArgsSing k = traverse21 $ \x -> Pw (Lift1 ()) <$> k x
+ haskell/Language/Hakaru/Syntax/Transform.hs view
@@ -0,0 +1,257 @@+{-# LANGUAGE CPP+ , FlexibleInstances+ , GADTs+ , DataKinds+ , TypeOperators+ , KindSignatures+ , LambdaCase+ , ViewPatterns+ , DeriveDataTypeable+ , StandaloneDeriving+ , OverlappingInstances+ , UndecidableInstances+ , RankNTypes+ #-}++{-# OPTIONS_GHC -Wall -fwarn-tabs #-}+-- |+-- Module : Language.Hakaru.Syntax.Transform+-- Copyright : Copyright (c) 2016 the Hakaru team+-- License : BSD3+-- Stability : experimental+-- Portability : GHC-only+--+-- The internal syntax of Hakaru transformations, which are functions on Hakaru+-- terms which are neither primitive, nor expressible in terms of Hakaru+-- primitives.+----------------------------------------------------------------+module Language.Hakaru.Syntax.Transform+ (+ -- * Transformation internal syntax+ TransformImpl(..)+ , Transform(..)+ -- * Some utilities+ , transformName, allTransforms+ -- * Mapping of input type to output type for transforms+ , typeOfTransform+ -- * Transformation contexts+ , TransformCtx(..), HasTransformCtx(..), unionCtx, minimalCtx+ -- * Transformation tables+ , TransformTable(..), lookupTransform', simpleTable+ , unionTable, someTransformations+ )+ where+++import Language.Hakaru.Syntax.ABT+import Language.Hakaru.Syntax.SArgs+import Language.Hakaru.Syntax.IClasses+import Language.Hakaru.Syntax.Variable+import Language.Hakaru.Types.DataKind+import Language.Hakaru.Types.Sing++import Control.Applicative (Alternative(..), Applicative(..))+import Data.Number.Nat+import Data.Data (Data, Typeable)+import Data.List (stripPrefix)+import Data.Monoid (Monoid(..))++#if !(MIN_VERSION_base(4,11,0))+import Data.Semigroup+#endif++----------------------------------------------------------------++-- | Some transformations have the same type and 'same' semantics, but are+-- implemented in multiple different ways. Such transformations are+-- distinguished in concrete syntax by differing keywords.+data TransformImpl = InMaple | InHaskell+ deriving (Eq, Ord, Show, Read, Data, Typeable)++-- | Transformations and their types. Like 'Language.Hakaru.Syntax.AST.SCon'.+data Transform :: [([Hakaru], Hakaru)] -> Hakaru -> * where+ Expect ::+ Transform+ '[ LC ('HMeasure a), '( '[ a ], 'HProb) ] 'HProb++ Observe ::+ Transform+ '[ LC ('HMeasure a), LC a ] ('HMeasure a)++ MH ::+ Transform+ '[ LC (a ':-> 'HMeasure a), LC ('HMeasure a) ]+ (a ':-> 'HMeasure (HPair a 'HProb))++ MCMC ::+ Transform+ '[ LC (a ':-> 'HMeasure a), LC ('HMeasure a) ]+ (a ':-> 'HMeasure a)++ Disint :: TransformImpl ->+ Transform+ '[ LC ('HMeasure (HPair a b)) ]+ (a :-> 'HMeasure b)++ Summarize ::+ Transform '[ LC a ] a++ Simplify ::+ Transform '[ LC a ] a++ Reparam ::+ Transform '[ LC a ] a++deriving instance Eq (Transform args a)+deriving instance Show (Transform args a)++instance Eq (Some2 Transform) where+ Some2 t0 == Some2 t1 =+ case (t0, t1) of+ (Expect , Expect ) -> True+ (Observe , Observe ) -> True+ (MH , MH ) -> True+ (MCMC , MCMC ) -> True+ (Disint k0 , Disint k1) -> k0==k1+ (Summarize , Summarize) -> True+ (Simplify , Simplify ) -> True+ (Reparam , Reparam ) -> True+ _ -> False++instance Read (Some2 Transform) where+ readsPrec _ s =+ let trs = map (\t'@(Some2 t) -> (show t, t')) allTransforms+ readMay (s', t)+ | Just rs <- stripPrefix s' s = [(t, rs)]+ | otherwise = []+ in concatMap readMay trs++-- | The concrete syntax names of transformations.+transformName :: Transform args a -> String+transformName =+ \case+ Expect -> "expect"+ Observe -> "observe"+ MH -> "mh"+ MCMC -> "mcmc"+ Disint k -> "disint" +++ (case k of+ InHaskell -> ""+ InMaple -> "_m")+ Summarize -> "summarize"+ Simplify -> "simplify"+ Reparam -> "reparam"++-- | All transformations.+allTransforms :: [Some2 Transform]+allTransforms =+ [ Some2 Expect, Some2 Observe, Some2 MH, Some2 MCMC+ , Some2 (Disint InHaskell), Some2 (Disint InMaple)+ , Some2 Summarize, Some2 Simplify, Some2 Reparam ]++typeOfTransform+ :: Transform as x+ -> SArgsSing as+ -> Sing x+typeOfTransform t as =+ case (t,as) of+ (Expect , _)+ -> SProb+ (Observe , Pw _ e :* _ :* End)+ -> e+ (MH , Pw _ (fst.sUnFun -> a) :* _ :* End)+ -> SFun a (SMeasure (sPair a SProb))+ (MCMC , Pw _ a :* _)+ -> a+ (Disint _ , Pw _ (sUnPair.sUnMeasure -> (a,b)) :* End)+ -> SFun a (SMeasure b)+ (Summarize, Pw _ e :* End)+ -> e+ (Simplify , Pw _ e :* End)+ -> e+ (Reparam , Pw _ e :* End)+ -> e++-- | The context in which a transformation is called. Currently this is simply+-- the next free variable in the enclosing program, but it could one day be+-- expanded to include more information, e.g., an association of variables to+-- terms in the enclosing program.+newtype TransformCtx = TransformCtx+ { nextFreeVar :: Nat }+ deriving (Eq, Ord, Show)++-- | The smallest possible context, i.e. a default context suitable for use when+-- performing induction on terms which may contain transformations as subterms.+minimalCtx :: TransformCtx+minimalCtx = TransformCtx { nextFreeVar = 0 }++-- | The union of two contexts+unionCtx :: TransformCtx -> TransformCtx -> TransformCtx+unionCtx ctx0 ctx1 =+ TransformCtx { nextFreeVar = max (nextFreeVar ctx0) (nextFreeVar ctx1) }++instance Semigroup TransformCtx where+ (<>) = unionCtx++instance Monoid TransformCtx where+ mempty = minimalCtx+#if !(MIN_VERSION_base(4,11,0))+ mappend = (<>)+#endif++-- | The class of types which have an associated context+class HasTransformCtx x where+ ctxOf :: x -> TransformCtx++instance HasTransformCtx (Variable (a :: Hakaru)) where+ ctxOf v = TransformCtx { nextFreeVar = varID v + 1 }++instance ABT syn abt => HasTransformCtx (abt (xs :: [Hakaru]) (a :: Hakaru)) where+ ctxOf t = TransformCtx { nextFreeVar = nextFree t }++-- | A functional lookup table which indicates how to expand+-- transformations. The function returns @Nothing@ when the transformation+-- shouldn't be expanded. When it returns @Just k@, @k@ is passed an @SArgs@+-- and a @TransformCtx@.+newtype TransformTable abt m+ = TransformTable+ { lookupTransform+ :: forall as b+ . Transform as b+ -> Maybe (TransformCtx -> SArgs abt as -> m (Maybe (abt '[] b))) }++-- | A variant of @lookupTransform@ which joins the two layers of @Maybe@.+lookupTransform'+ :: (Applicative m)+ => TransformTable abt m+ -> Transform as b+ -> TransformCtx+ -> SArgs abt as -> m (Maybe (abt '[] b))+lookupTransform' tbl tr ctx args=+ case lookupTransform tbl tr of+ Just f -> f ctx args+ Nothing -> pure Nothing++-- | Builds a 'simple' transformation table, i.e. one which doesn't make use of+-- the monadic context. Such a table is valid in every @Applicative@ context.+simpleTable+ :: (Applicative m)+ => (forall as b . Transform as b+ -> Maybe (TransformCtx -> SArgs abt as -> Maybe (abt '[] b)))+ -> TransformTable abt m+simpleTable k = TransformTable $ \tr -> fmap (fmap (fmap pure)) $ k tr++-- | Take the left-biased union of two transformation tables+unionTable :: TransformTable abt m+ -> TransformTable abt m+ -> TransformTable abt m+unionTable tbl0 tbl1 = TransformTable $ \tr ->+ lookupTransform tbl0 tr <|>+ lookupTransform tbl1 tr++-- | Intersect a transformation table with a list of transformations+someTransformations :: [Some2 Transform]+ -> TransformTable abt m+ -> TransformTable abt m+someTransformations toExpand tbl = TransformTable $+ \tr -> if Some2 tr `elem` toExpand then lookupTransform tbl tr else Nothing
haskell/Language/Hakaru/Syntax/TypeCheck.hs view
@@ -35,6 +35,7 @@ , inferable , mustCheck , TypedAST(..)+ , onTypedAST, onTypedASTM, elimTypedAST , inferType , checkType ) where@@ -43,6 +44,7 @@ import Control.Category import Data.Proxy (KProxy(..)) import Data.Text (pack, Text())+import Data.Either (partitionEithers) import qualified Data.IntMap as IM import qualified Data.Traversable as T import qualified Data.List.NonEmpty as L@@ -56,6 +58,8 @@ import qualified Language.Hakaru.Parser.AST as U import Data.Number.Nat (fromNat)+import Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad+import Language.Hakaru.Syntax.TypeCheck.Unification import Language.Hakaru.Syntax.IClasses import Language.Hakaru.Types.DataKind (Hakaru(..), HData', HBool) import Language.Hakaru.Types.Sing@@ -72,6 +76,9 @@ import Language.Hakaru.Syntax.AST import Language.Hakaru.Syntax.AST.Sing (sing_Literal, sing_MeasureOp)+import Language.Hakaru.Pretty.Concrete (prettyType, prettyTypeT)+import Language.Hakaru.Syntax.TypeOf (typeOf)+import Language.Hakaru.Syntax.Prelude (triv) ---------------------------------------------------------------- ----------------------------------------------------------------@@ -165,7 +172,6 @@ -- typing issue. Thus, for non-empty arrays and non-phantom -- record types, we should be able to infer the whole type -- provided we can infer the various subterms.- go U.Empty_ = True go (U.Pair_ e1 e2) = mustCheck e1 && mustCheck e2 go (U.Array_ _ e1) = mustCheck' e1 go (U.ArrayLiteral_ es) = F.all mustCheck es@@ -188,225 +194,29 @@ go (U.Product_ _ _ _) = False go (U.Bucket_ _ _ _) = False go U.Reject_ = True- go (U.Expect_ _ e2) = mustCheck' e2- go (U.Observe_ e1 _) = mustCheck e1+ go (U.Transform_ tr es ) =+ case (tr, es) of+ (Expect , (Nil2, e1) U.:* _ U.:* U.End)+ -> mustCheck e1+ (Observe , (Nil2, e1) U.:* _ U.:* U.End)+ -> mustCheck e1+ (MCMC , (Nil2, e1) U.:* (Nil2, e2) U.:* U.End)+ -> mustCheck e1 && mustCheck e2+ (Disint _ , (Nil2, e1) U.:* U.End)+ -> mustCheck e1+ (Simplify , (Nil2, e1) U.:* U.End)+ -> mustCheck e1+ (Summarize, (Nil2, e1) U.:* U.End)+ -> mustCheck e1+ (Reparam , (Nil2, e1) U.:* U.End)+ -> mustCheck e1+ go U.InjTyped{} = False mustCheck' :: MetaABT U.SourceSpan U.Term '[ 'U.U ] 'U.U -> Bool mustCheck' e = caseBind e $ \_ e' -> mustCheck e' ------------------------------------------------------------------------------------------------------------------------------------type Input = Maybe (V.Vector Text)--type Ctx = VarSet ('KProxy :: KProxy Hakaru)--data TypeCheckMode = StrictMode | LaxMode | UnsafeMode- deriving (Read, Show)--type TypeCheckError = Text--newtype TypeCheckMonad a =- TCM { unTCM :: Ctx- -> Input- -> TypeCheckMode- -> Either TypeCheckError a }--runTCM :: TypeCheckMonad a -> Input -> TypeCheckMode -> Either TypeCheckError a-runTCM m = unTCM m emptyVarSet--instance Functor TypeCheckMonad where- fmap f m = TCM $ \ctx input mode -> fmap f (unTCM m ctx input mode)--instance Applicative TypeCheckMonad where- pure x = TCM $ \_ _ _ -> Right x- mf <*> mx = mf >>= \f -> fmap f mx---- TODO: ensure this instance has the appropriate strictness-instance Monad TypeCheckMonad where- return = pure- mx >>= k =- TCM $ \ctx input mode ->- unTCM mx ctx input mode >>= \x ->- unTCM (k x) ctx input mode--{---- We could provide this instance, but there's no decent error--- message to give for the 'empty' case that works in all circumstances.--- Because we only would need this to define 'inferOneCheckOthers',--- we inline the definition there instead.-instance Alternative TypeCheckMonad where- empty = failwith "Alternative.empty"- x <|> y = TCM $ \ctx mode ->- case unTCM x ctx mode of- Left _ -> unTCM y ctx mode- Right e -> Right e--}--showT :: Show a => a -> Text-showT = pack . show--show1T :: Show1 a => a (i :: Hakaru) -> Text-show1T = pack . show1----- | Return the mode in which we're checking\/inferring types.-getInput :: TypeCheckMonad Input-getInput = TCM $ \_ input _ -> Right input---- | Return the mode in which we're checking\/inferring types.-getMode :: TypeCheckMonad TypeCheckMode-getMode = TCM $ \_ _ mode -> Right mode---- | Extend the typing context, but only locally.-pushCtx- :: Variable (a :: Hakaru)- -> TypeCheckMonad b- -> TypeCheckMonad b-pushCtx x (TCM m) = TCM (m . insertVarSet x)--getCtx :: TypeCheckMonad Ctx-getCtx = TCM $ \ctx _ _ -> Right ctx--failwith :: TypeCheckError -> TypeCheckMonad r-failwith e = TCM $ \_ _ _ -> Left e--failwith_ :: TypeCheckError -> TypeCheckMonad r-failwith_ = failwith--makeErrMsg- :: Text- -> Maybe U.SourceSpan- -> Text- -> TypeCheckMonad TypeCheckError-makeErrMsg header sourceSpan footer = do- input_ <- getInput- case (sourceSpan, input_) of- (Just s, Just input) ->- return $ mconcat [ header- , "\n\n"- , U.printSourceSpan s input- , footer- ]- _ ->- return $ mconcat [ header, "\n", footer ]---- | Fail with a type-mismatch error.-typeMismatch- :: Maybe U.SourceSpan- -> Either Text (Sing (a :: Hakaru))- -> Either Text (Sing (b :: Hakaru))- -> TypeCheckMonad r-typeMismatch s typ1 typ2 = failwith =<<- makeErrMsg- "Type Mismatch:"- s- (mconcat [ "expected "- , msg1- , ", found "- , msg2- ])- where- msg1 = case typ1 of { Left msg -> msg; Right typ -> show1T typ }- msg2 = case typ2 of { Left msg -> msg; Right typ -> show1T typ }--missingInstance- :: Text- -> Sing (a :: Hakaru)- -> Maybe U.SourceSpan- -> TypeCheckMonad r-missingInstance clas typ s = failwith =<<- makeErrMsg- "Missing Instance:"- s- (mconcat $ ["No ", clas, " instance for type ", showT typ])--missingLub- :: Sing (a :: Hakaru)- -> Sing (b :: Hakaru)- -> Maybe U.SourceSpan- -> TypeCheckMonad r-missingLub typ1 typ2 s = failwith =<<- makeErrMsg- "Missing common type:"- s- (mconcat ["No lub of types ", showT typ1, " and ", showT typ2])---- we can't have free variables, so it must be a typo-ambiguousFreeVariable- :: Text- -> Maybe U.SourceSpan- -> TypeCheckMonad r-ambiguousFreeVariable x s = failwith =<<- makeErrMsg- (mconcat $ ["Name not in scope: ", x])- s- " perhaps it is a typo?"--ambiguousNullCoercion- :: Maybe U.SourceSpan- -> TypeCheckMonad r-ambiguousNullCoercion s = failwith =<<- makeErrMsg- "Cannot infer type for null-coercion over a checking term."- s- "Please add a type annotation to either the term being coerced or the result of the coercion."--ambiguousEmptyNary- :: Maybe U.SourceSpan- -> TypeCheckMonad r-ambiguousEmptyNary s = failwith =<<- makeErrMsg- "Cannot infer unambiguous type for empty n-ary operator."- s- "Try adding an annotation on the result of the operator."--ambiguousMustCheckNary- :: Maybe U.SourceSpan- -> TypeCheckMonad r-ambiguousMustCheckNary s = failwith =<<- makeErrMsg- "Could not infer any of the arguments."- s- "Try adding a type annotation to at least one of them."--ambiguousMustCheck- :: Maybe U.SourceSpan- -> TypeCheckMonad r-ambiguousMustCheck s = failwith =<<- makeErrMsg- "Cannot infer types for checking terms."- s- "Please add a type annotation."--argumentNumberError- :: TypeCheckMonad r-argumentNumberError = failwith =<<- makeErrMsg "Argument error:" Nothing "Passed wrong number of arguments"-------------------------------------------------------------------------------------------------------------------------------------- BUG: haddock doesn't like annotations on GADT constructors. So--- here we'll avoid using the GADT syntax, even though it'd make--- the data type declaration prettier\/cleaner.--- <https://github.com/hakaru-dev/hakaru/issues/6>------ | The @e' ∈ τ@ portion of the inference judgement.-data TypedAST (abt :: [Hakaru] -> Hakaru -> *)- = forall b. TypedAST !(Sing b) !(abt '[] b)--instance Show2 abt => Show (TypedAST abt) where- showsPrec p (TypedAST typ e) =- showParen_12 p "TypedAST" typ e---makeVar :: forall (a :: Hakaru). Variable 'U.U -> Sing a -> Variable a-makeVar (Variable hintID nameID _) typ =- Variable hintID nameID typ-- inferBinder :: (ABT Term abt) => Sing a@@ -461,13 +271,6 @@ Nil1 -> checkType eTyp e Cons1 x xs' -> pushCtx x (bind x <$> checkBinders xs' eTyp e) ---- HACK: Passing this list of variables feels like a hack--- it would be nice if it could be removed from this datatype-data TypedReducer (abt :: [Hakaru] -> Hakaru -> *)- (xs :: [Hakaru])- = forall b. TypedReducer !(Sing b) (List1 Variable xs) (Reducer abt xs b)- ---------------------------------------------------------------- -- | Given a typing environment and a term, synthesize the term's -- type (and produce an elaborated term):@@ -519,11 +322,15 @@ U.App_ e1 e2 -> do TypedAST typ1 e1' <- inferType_ e1- case typ1 of- SFun typ2 typ3 -> do- e2' <- checkType_ typ2 e2- return . TypedAST typ3 $ syn (App_ :$ e1' :* e2' :* End)- _ -> typeMismatch sourceSpan (Left "function type") (Right typ1)+ unifyFun typ1 sourceSpan $ \typ2 typ3 -> do+ e2' <- checkType_ typ2 e2+ return . TypedAST typ3 $ syn (App_ :$ e1' :* e2' :* End)++ -- case typ1 of+ -- SFun typ2 typ3 -> do+ -- e2' <- checkType_ typ2 e2+ -- return . TypedAST typ3 $ syn (App_ :$ e1' :* e2' :* End)+ -- _ -> typeMismatch sourceSpan (Left "function type") (Right typ1) -- The above is the standard rule that everyone uses. -- However, if the @e1@ is a lambda (rather than a primop -- or a variable), then it will require a type annotation.@@ -632,37 +439,22 @@ U.MBind_ e1 e2 -> caseBind e2 $ \x e2' -> do TypedAST typ1 e1' <- inferType_ e1- case typ1 of- SMeasure typ2 ->- let x' = makeVar x typ2 in- pushCtx x' $ do- TypedAST typ3 e3' <- inferType_ e2'- case typ3 of- SMeasure _ ->- return . TypedAST typ3 $- syn (MBind :$ e1' :* bind x' e3' :* End)- _ -> typeMismatch sourceSpan (Left "HMeasure") (Right typ3)- {-- -- BUG: the \"ambiguous\" @abt@ issue again...- inferBinder typ2 e2 $ \typ3 e2' ->- case typ3 of- SMeasure _ -> return . TypedAST typ3 $- syn (MBind :$ e1' :* e2' :* End)- _ -> typeMismatch (Left "HMeasure") (Right typ3)- -}- _ -> typeMismatch sourceSpan (Left "HMeasure") (Right typ1)+ unifyMeasure typ1 sourceSpan $ \typ2 ->+ let x' = makeVar x typ2 in+ pushCtx x' $ do+ TypedAST typ3 e3' <- inferType_ e2'+ unifyMeasure typ3 sourceSpan $ \_ ->+ return . TypedAST typ3 $ syn (MBind :$ e1' :* bind x' e3' :* End) U.Plate_ e1 e2 -> caseBind e2 $ \x e2' -> do e1' <- checkType_ SNat e1 let x' = makeVar x SNat pushCtx x' $ do- TypedAST typ2 e3' <- inferType_ e2'- case typ2 of- SMeasure typ3 ->- return . TypedAST (SMeasure . SArray $ typ3) $- syn (Plate :$ e1' :* bind x' e3' :* End)- _ -> typeMismatch sourceSpan (Left "HMeasure") (Right typ2)+ TypedAST typ2 e3' <- inferType_ e2'+ unifyMeasure typ2 sourceSpan $ \typ3 ->+ return . TypedAST (SMeasure . SArray $ typ3) $+ syn (Plate :$ e1' :* bind x' e3' :* End) U.Chain_ e1 e2 e3 -> caseBind e3 $ \x e3' -> do@@ -671,14 +463,11 @@ let x' = makeVar x typ2 pushCtx x' $ do TypedAST typ3 e4' <- inferType_ e3'- case typ3 of- SMeasure (SData (STyCon sym `STyApp` a `STyApp` b) _) ->- case (jmEq1 sym sSymbol_Pair, jmEq1 b typ2) of- (Just Refl, Just Refl) ->- return . TypedAST (SMeasure $ sPair (SArray a) typ2) $- syn (Chain :$ e1' :* e2' :* bind x' e4' :* End)- _ -> typeMismatch sourceSpan (Left "HMeasure(HPair)") (Right typ3)- _ -> typeMismatch sourceSpan (Left "HMeasure(HPair)") (Right typ3)+ unifyMeasure typ3 sourceSpan $ \typ4 ->+ unifyPair typ4 sourceSpan $ \a b ->+ matchTypes typ2 b sourceSpan () () $+ return . TypedAST (SMeasure $ sPair (SArray a) typ2) $+ syn (Chain :$ e1' :* e2' :* bind x' e4' :* End) U.Integrate_ e1 e2 e3 -> do e1' <- checkType_ SReal e1@@ -714,21 +503,7 @@ return . TypedAST typ1 $ syn (Bucket e1' e2' r1') - U.Expect_ e1 e2 -> do- TypedAST typ1 e1' <- inferType_ e1- case typ1 of- SMeasure typ2 -> do- e2' <- checkBinder typ2 SProb e2- return . TypedAST SProb $ syn (Expect :$ e1' :* e2' :* End)- _ -> typeMismatch sourceSpan (Left "HMeasure") (Right typ1)-- U.Observe_ e1 e2 -> do- TypedAST typ1 e1' <- inferType_ e1- case typ1 of- SMeasure typ2 -> do- e2' <- checkType_ typ2 e2- return . TypedAST typ1 $ syn (Observe :$ e1' :* e2' :* End)- _ -> typeMismatch sourceSpan (Left "HMeasure") (Right typ1)+ U.Transform_ tr es -> inferTransform sourceSpan tr es U.Superpose_ pes -> do -- TODO: clean up all this @map fst@, @map snd@, @zip@ stuff@@ -738,15 +513,85 @@ StrictMode -> inferOneCheckOthers_ (L.toList $ fmap snd pes) LaxMode -> inferLubType sourceSpan (L.toList $ fmap snd pes) UnsafeMode -> inferLubType sourceSpan (L.toList $ fmap snd pes)- case typ of- SMeasure _ -> do- ps' <- T.traverse (checkType SProb) (fmap fst pes)- return $ TypedAST typ (syn (Superpose_ (L.zip ps' (L.fromList es'))))- _ -> typeMismatch sourceSpan (Left "HMeasure") (Right typ)+ unifyMeasure typ sourceSpan $ \_ -> do+ ps' <- T.traverse (checkType SProb) (fmap fst pes)+ return $ TypedAST typ (syn (Superpose_ (L.zip ps' (L.fromList es')))) + U.InjTyped t -> let t' = t in return $ TypedAST (typeOf t') t'+ _ | mustCheck e0 -> ambiguousMustCheck sourceSpan | otherwise -> error "inferType: missing an inferable branch!" + inferTransform+ :: Maybe U.SourceSpan+ -> Transform as x+ -> U.SArgs U.U_ABT as+ -> TypeCheckMonad (TypedAST abt)+ inferTransform sourceSpan+ Expect+ ((Nil2, e1) U.:* (Cons2 U.ToU Nil2, e2) U.:* U.End) = do+ let e1src = getMetadata e1+ TypedAST typ1 e1' <- inferType_ e1+ unifyMeasure typ1 e1src $ \typ2 -> do+ e2' <- checkBinder typ2 SProb e2+ return . TypedAST SProb $ syn+ (Transform_ Expect :$ e1' :* e2' :* End)++ inferTransform sourceSpan+ Observe+ ((Nil2, e1) U.:* (Nil2, e2) U.:* U.End) = do+ let e1src = getMetadata e1+ TypedAST typ1 e1' <- inferType_ e1+ unifyMeasure typ1 e1src $ \typ2 -> do+ e2' <- checkType_ typ2 e2+ return . TypedAST typ1 $ syn+ (Transform_ Observe :$ e1' :* e2' :* End)++ inferTransform sourceSpan+ MCMC+ ((Nil2, e1) U.:* (Nil2, e2) U.:* U.End) = do+ let e1src = getMetadata e1+ e2src = getMetadata e2+ TypedAST typ1 e1' <- inferType_ e1+ TypedAST typ2 e2' <- inferType_ e2+ unifyFun typ1 e1src $ \typa typmb ->+ unifyMeasure typmb e1src $ \typb ->+ unifyMeasure typ2 e2src $ \typc ->+ matchTypes typa typb e1src (SFun typa (SMeasure typa)) typ1 $+ matchTypes typb typc e2src typmb typ2 $+ return $ TypedAST (SFun typa (SMeasure typa))+ $ syn $ Transform_ MCMC :$ e1' :* e2' :* End++ inferTransform sourceSpan+ (Disint k)+ ((Nil2, e1) U.:* U.End) = do+ let e1src = getMetadata e1+ TypedAST typ1 e1' <- inferType_ e1+ unifyMeasure typ1 e1src $ \typ2 ->+ unifyPair typ2 e1src $ \typa typb ->+ return $ TypedAST (SFun typa (SMeasure typb)) $+ syn $ Transform_ (Disint k) :$ e1' :* End++ inferTransform sourceSpan+ Simplify+ ((Nil2, e1) U.:* U.End) = do+ TypedAST typ1 e1' <- inferType_ e1+ return $ TypedAST typ1 $ syn (Transform_ Simplify :$ e1' :* End)++ inferTransform sourceSpan+ Reparam+ ((Nil2, e1) U.:* U.End) = do+ TypedAST typ1 e1' <- inferType_ e1+ return $ TypedAST typ1 $ syn (Transform_ Reparam :$ e1' :* End)++ inferTransform sourceSpan+ Summarize+ ((Nil2, e1) U.:* U.End) = do+ TypedAST typ1 e1' <- inferType_ e1+ return $ TypedAST typ1 $ syn (Transform_ Summarize :$ e1' :* End)++ inferTransform _ tr _ = error $ "inferTransform{" ++ show tr ++ "}: TODO"+ inferPrimOp :: U.PrimOp -> [U.AST]@@ -776,6 +621,14 @@ syn (PrimOp_ RealPow :$ e1' :* e2' :* End) _ -> argumentNumberError + inferPrimOp U.Choose es =+ case es of + [e1, e2] -> do e1' <- checkType_ SNat e1+ e2' <- checkType_ SNat e2+ return . TypedAST SNat $+ syn (PrimOp_ Choose :$ e1' :* e2' :* End)+ _ -> argumentNumberError+ inferPrimOp U.Exp es = case es of [e] -> do e' <- checkType_ SReal e@@ -932,6 +785,12 @@ syn (PrimOp_ y :$ e' :* End) _ -> argumentNumberError + inferPrimOp U.Floor es =+ case es of+ [e] -> do e' <- checkType_ SProb e+ return . TypedAST SNat $ syn (PrimOp_ Floor :$ e' :* End)+ _ -> argumentNumberError+ inferPrimOp x _ = error ("TODO: inferPrimOp: " ++ show x) @@ -941,37 +800,31 @@ inferArrayOp U.Index_ es = case es of [e1, e2] -> do TypedAST typ1 e1' <- inferType_ e1- case typ1 of- SArray typ2 -> do- e2' <- checkType_ SNat e2- return . TypedAST typ2 $- syn (ArrayOp_ (Index typ2) :$ e1' :* e2' :* End)- _ -> typeMismatch Nothing (Left "HArray") (Right typ1)+ unifyArray typ1 Nothing $ \typ2 -> do+ e2' <- checkType_ SNat e2+ return . TypedAST typ2 $+ syn (ArrayOp_ (Index typ2) :$ e1' :* e2' :* End) _ -> argumentNumberError inferArrayOp U.Size es = case es of [e] -> do TypedAST typ e' <- inferType_ e- case typ of- SArray typ1 -> do- return . TypedAST SNat $- syn (ArrayOp_ (Size typ1) :$ e' :* End)- _ -> typeMismatch Nothing (Left "HArray") (Right typ)+ unifyArray typ Nothing $ \typ1 ->+ return . TypedAST SNat $+ syn (ArrayOp_ (Size typ1) :$ e' :* End) _ -> argumentNumberError inferArrayOp U.Reduce es = case es of [e1, e2, e3] -> do TypedAST typ e1' <- inferType_ e1- case typ of- SFun typ1 typ2 -> do- Refl <- jmEq1_ typ2 (SFun typ1 typ1)- e2' <- checkType_ typ1 e2- e3' <- checkType_ (SArray typ1) e3- return . TypedAST typ1 $- syn (ArrayOp_ (Reduce typ1)- :$ e1' :* e2' :* e3' :* End)- _ -> typeMismatch Nothing (Right typ) (Left "HFun")+ unifyFun typ Nothing $ \typ1 typ2 -> do+ Refl <- jmEq1_ typ2 (SFun typ1 typ1)+ e2' <- checkType_ typ1 e2+ e3' <- checkType_ (SArray typ1) e3+ return . TypedAST typ1 $+ syn (ArrayOp_ (Reduce typ1)+ :$ e1' :* e2' :* e3' :* End) _ -> argumentNumberError inferReducer :: U.Reducer xs U.U_ABT 'U.U@@ -1016,87 +869,6 @@ h <- getHSemiring typ return $ TypedReducer typ xs (Red_Add h (bind x' e3)) -make_NaryOp :: Sing a -> U.NaryOp -> TypeCheckMonad (NaryOp a)-make_NaryOp a U.And = isBool a >>= \Refl -> return And-make_NaryOp a U.Or = isBool a >>= \Refl -> return Or-make_NaryOp a U.Xor = isBool a >>= \Refl -> return Xor-make_NaryOp a U.Iff = isBool a >>= \Refl -> return Iff-make_NaryOp a U.Min = Min <$> getHOrd a-make_NaryOp a U.Max = Max <$> getHOrd a-make_NaryOp a U.Sum = Sum <$> getHSemiring a-make_NaryOp a U.Prod = Prod <$> getHSemiring a--isBool :: Sing a -> TypeCheckMonad (TypeEq a HBool)-isBool typ =- case jmEq1 typ sBool of- Just proof -> return proof- Nothing -> typeMismatch Nothing (Left "HBool") (Right typ)--jmEq1_ :: Sing (a :: Hakaru)- -> Sing (b :: Hakaru)- -> TypeCheckMonad (TypeEq a b)-jmEq1_ typA typB =- case jmEq1 typA typB of- Just proof -> return proof- Nothing -> typeMismatch Nothing (Right typA) (Right typB)---getHEq :: Sing a -> TypeCheckMonad (HEq a)-getHEq typ =- case hEq_Sing typ of- Just theEq -> return theEq- Nothing -> missingInstance "HEq" typ Nothing--getHOrd :: Sing a -> TypeCheckMonad (HOrd a)-getHOrd typ =- case hOrd_Sing typ of- Just theOrd -> return theOrd- Nothing -> missingInstance "HOrd" typ Nothing--getHSemiring :: Sing a -> TypeCheckMonad (HSemiring a)-getHSemiring typ =- case hSemiring_Sing typ of- Just theSemi -> return theSemi- Nothing -> missingInstance "HSemiring" typ Nothing--getHRing :: Sing a -> TypeCheckMode -> TypeCheckMonad (SomeRing a)-getHRing typ mode =- case mode of- StrictMode -> case hRing_Sing typ of- Just theRing -> return (SomeRing theRing CNil)- Nothing -> missingInstance "HRing" typ Nothing- LaxMode -> case findRing typ of- Just proof -> return proof- Nothing -> missingInstance "HRing" typ Nothing- UnsafeMode -> case findRing typ of- Just proof -> return proof- Nothing -> missingInstance "HRing" typ Nothing--getHFractional :: Sing a -> TypeCheckMode -> TypeCheckMonad (SomeFractional a)-getHFractional typ mode =- case mode of- StrictMode -> case hFractional_Sing typ of- Just theFrac -> return (SomeFractional theFrac CNil)- Nothing -> missingInstance "HFractional" typ Nothing- LaxMode -> case findFractional typ of- Just proof -> return proof- Nothing -> missingInstance "HFractional" typ Nothing- UnsafeMode -> case findFractional typ of- Just proof -> return proof- Nothing -> missingInstance "HFractional" typ Nothing---------------------------------------------------------------------data TypedASTs (abt :: [Hakaru] -> Hakaru -> *)- = forall b. TypedASTs !(Sing b) [abt '[] b]--{--instance Show2 abt => Show (TypedASTs abt) where- showsPrec p (TypedASTs typ es) =- showParen_1x p "TypedASTs" typ es--}- -- TODO: can we make this lazier in the second component of 'TypedASTs' -- so that we can perform case analysis on the type component before -- actually evaluating 'checkOthers'? Problem is, even though we@@ -1135,27 +907,6 @@ :: forall a. Sing a -> [U.AST] -> TypeCheckMonad [abt '[] a] checkOthers typ = T.traverse (checkType typ) ---- TODO: some day we may want a variant of this function which--- returns the error message in the event that the computation fails--- (e.g., to provide all of them if 'inferOneCheckOthers' ultimately--- fails.------ | a la @optional :: Alternative f => f a -> f (Maybe a)@ but--- without needing the 'empty' of the 'Alternative' class.-try :: TypeCheckMonad a -> TypeCheckMonad (Maybe a)-try m = TCM $ \ctx input mode -> Right $- case unTCM m ctx input mode of- Left _ -> Nothing -- Don't worry; no side effects to unwind- Right e -> Just e---- | Tries to typecheck in a given mode-tryWith :: TypeCheckMode -> TypeCheckMonad a -> TypeCheckMonad (Maybe a)-tryWith mode m = TCM $ \ctx input _ -> Right $- case unTCM m ctx input mode of- Left _ -> Nothing- Right e -> Just e- -- | Given a list of terms which must all have the same type, infer -- all the terms in order and coerce them to the lub of all their -- types. This is appropriate for 'LaxMode' where we need to insert@@ -1214,24 +965,6 @@ :: forall b. Sing b -> [U.Branch] -> TypeCheckMonad [Branch a abt b] checkOthers typ = T.traverse (checkBranch typA typ) -data SomeBranch a abt = forall b. SomeBranch !(Sing b) [Branch a abt b]---- TODO: find a better name, and move to where 'LC_' is defined.-lc :: (LC_ abt a -> LC_ abt b) -> abt '[] a -> abt '[] b-lc f = unLC_ . f . LC_--coerceTo_nonLC :: (ABT Term abt) => Coercion a b -> abt xs a -> abt xs b-coerceTo_nonLC = underBinders . lc . coerceTo--coerceFrom_nonLC :: (ABT Term abt) => Coercion a b -> abt xs b -> abt xs a-coerceFrom_nonLC = underBinders . lc . coerceFrom---- BUG: how to make this not an orphan, without dealing with cyclic imports between AST.hs (for the 'LC_' instance), Datum.hs, and Coercion.hs?-instance (ABT Term abt) => Coerce (Branch a abt) where- coerceTo c (Branch pat e) = Branch pat (coerceTo_nonLC c e)- coerceFrom c (Branch pat e) = Branch pat (coerceFrom_nonLC c e)-- inferCaseLax :: forall abt a . (ABT Term abt)@@ -1331,13 +1064,10 @@ -- We keep it here in case, we later use a U.Lam which doesn't -- carry the type of its variable U.Lam_ (U.SSing typ) e1 ->- case typ0 of- SFun typ1 typ2 ->- case jmEq1 typ1 typ of- Just Refl -> do e1' <- checkBinder typ1 typ2 e1- return $ syn (Lam_ :$ e1' :* End)- Nothing -> typeMismatch sourceSpan (Right typ1) (Right typ)- _ -> typeMismatch sourceSpan (Right typ0) (Left "function type")+ unifyFun typ0 sourceSpan $ \typ1 typ2 ->+ matchTypes typ1 typ sourceSpan () () $+ do e1' <- checkBinder typ1 typ2 e1+ return $ syn (Lam_ :$ e1' :* End) U.Let_ e1 e2 -> do TypedAST typ1 e1' <- inferType_ e1@@ -1350,11 +1080,9 @@ e1' <- checkType_ typ0 e1 return $ syn (CoerceTo_ CNil :$ e1' :* End) Just (dom, cod) ->- case jmEq1 typ0 cod of- Just Refl -> do- e1' <- checkType_ dom e1- return $ syn (CoerceTo_ c :$ e1' :* End)- Nothing -> typeMismatch sourceSpan (Right typ0) (Right cod)+ matchTypes typ0 cod sourceSpan () () $ do+ e1' <- checkType_ dom e1+ return $ syn (CoerceTo_ c :$ e1' :* End) U.UnsafeTo_ (Some2 c) e1 -> case singCoerceDomCod c of@@ -1362,11 +1090,9 @@ e1' <- checkType_ typ0 e1 return $ syn (UnsafeFrom_ CNil :$ e1' :* End) Just (dom, cod) ->- case jmEq1 typ0 dom of- Just Refl -> do- e1' <- checkType_ cod e1- return $ syn (UnsafeFrom_ c :$ e1' :* End)- Nothing -> typeMismatch sourceSpan (Right typ0) (Right dom)+ matchTypes typ0 dom sourceSpan () () $ do+ e1' <- checkType_ cod e1+ return $ syn (UnsafeFrom_ c :$ e1' :* End) -- TODO: Find better place to put this logic U.PrimOp_ U.Infinity [] -> do@@ -1393,12 +1119,20 @@ StrictMode -> safeNaryOp typ0 LaxMode -> safeNaryOp typ0 UnsafeMode -> do- es' <- tryWith LaxMode (safeNaryOp typ0)- case es' of- Just es'' -> return es''- Nothing -> do- TypedAST typ e0' <- inferType (syn $ U.NaryOp_ op es)- checkOrUnsafeCoerce sourceSpan e0' typ typ0+ op' <- make_NaryOp typ0 op+ (bads, goods) <-+ fmap partitionEithers . T.forM es $+ \e -> fmap (maybe (Left e) Right)+ (tryWith LaxMode (checkType_ typ0 e))+ if null bads+ then return $ syn (NaryOp_ op' (S.fromList goods))+ else do TypedAST typ bad <- inferType (case bads of+ [b] -> b+ _ -> syn $ U.NaryOp_ op bads)+ bad <- checkOrUnsafeCoerce sourceSpan bad typ typ0+ return (case bad:goods of+ [e] -> e+ es' -> syn $ NaryOp_ op' (S.fromList es')) where safeNaryOp :: forall c. Sing c -> TypeCheckMonad (abt '[] c) safeNaryOp typ = do@@ -1406,36 +1140,23 @@ es' <- T.forM es $ checkType_ typ return $ syn (NaryOp_ op' (S.fromList es')) - U.Empty_ ->- case typ0 of- SArray _ -> return $ syn (Empty_ typ0)- _ -> typeMismatch sourceSpan (Right typ0) (Left "HArray")- U.Pair_ e1 e2 ->- case typ0 of- SData (STyCon sym `STyApp` a `STyApp` b) _ ->- case jmEq1 sym sSymbol_Pair of- Just Refl -> do- e1' <- checkType_ a e1- e2' <- checkType_ b e2- return $ syn (Datum_ $ dPair_ a b e1' e2')- Nothing -> typeMismatch sourceSpan (Right typ0) (Left "HPair")- _ -> typeMismatch sourceSpan (Right typ0) (Left "HPair")+ unifyPair typ0 sourceSpan $ \a b -> do+ e1' <- checkType_ a e1+ e2' <- checkType_ b e2+ return $ syn (Datum_ $ dPair_ a b e1' e2') U.Array_ e1 e2 ->- case typ0 of- SArray typ1 -> do- e1' <- checkType_ SNat e1- e2' <- checkBinder SNat typ1 e2- return $ syn (Array_ e1' e2')- _ -> typeMismatch sourceSpan (Right typ0) (Left "HArray")+ unifyArray typ0 sourceSpan $ \typ1 -> do+ e1' <- checkType_ SNat e1+ e2' <- checkBinder SNat typ1 e2+ return $ syn (Array_ e1' e2') U.ArrayLiteral_ es ->- case typ0 of- SArray typ1 -> do+ unifyArray typ0 sourceSpan $ \typ1 ->+ if null es then return $ syn (Empty_ typ0) else do es' <- T.forM es $ checkType_ typ1 return $ syn (ArrayLiteral_ es')- _ -> typeMismatch sourceSpan (Right typ0) (Left "HArray") U.Datum_ (U.Datum hint d) -> case typ0 of@@ -1450,79 +1171,51 @@ return $ syn (Case_ e1' branches') U.Dirac_ e1 ->- case typ0 of- SMeasure typ1 -> do- e1' <- checkType_ typ1 e1- return $ syn (Dirac :$ e1' :* End)- _ -> typeMismatch sourceSpan (Right typ0) (Left "HMeasure")+ unifyMeasure typ0 sourceSpan $ \typ1 -> do+ e1' <- checkType_ typ1 e1+ return $ syn (Dirac :$ e1' :* End) U.MBind_ e1 e2 ->- case typ0 of- SMeasure _ -> do- TypedAST typ1 e1' <- inferType_ e1- case typ1 of- SMeasure typ2 -> do- e2' <- checkBinder typ2 typ0 e2- return $ syn (MBind :$ e1' :* e2' :* End)- _ -> typeMismatch sourceSpan (Right typ0) (Right typ1)- _ -> typeMismatch sourceSpan (Right typ0) (Left "HMeasure")+ unifyMeasure typ0 sourceSpan $ \_ -> do+ TypedAST typ1 e1' <- inferType_ e1+ unifyMeasure typ1 (getMetadata e1) $ \typ2 -> do+ e2' <- checkBinder typ2 typ0 e2+ return $ syn (MBind :$ e1' :* e2' :* End) U.Plate_ e1 e2 ->- case typ0 of- SMeasure typ1 -> do- e1' <- checkType_ SNat e1- case typ1 of- SArray typ2 -> do- e2' <- checkBinder SNat (SMeasure typ2) e2- return $ syn (Plate :$ e1' :* e2' :* End)- _ -> typeMismatch sourceSpan (Right typ1) (Left "HArray")- _ -> typeMismatch sourceSpan (Right typ0) (Left "HMeasure")+ unifyMeasure typ0 sourceSpan $ \typ1 -> do+ e1' <- checkType_ SNat e1+ unifyArray typ1 sourceSpan $ \typ2 -> do+ e2' <- checkBinder SNat (SMeasure typ2) e2+ return $ syn (Plate :$ e1' :* e2' :* End) U.Chain_ e1 e2 e3 ->- case typ0 of- SMeasure (SData (STyCon sym `STyApp` (SArray a) `STyApp` s) _) ->- case jmEq1 sym sSymbol_Pair of- Just Refl -> do- e1' <- checkType_ SNat e1- e2' <- checkType_ s e2- e3' <- checkBinder s (SMeasure $ sPair a s) e3- return $ syn (Chain :$ e1' :* e2' :* e3' :* End)- Nothing -> typeMismatch sourceSpan (Right typ0) (Left "HMeasure(HPair(HArray, s)")- _ -> typeMismatch sourceSpan (Right typ0) (Left "HMeasure(HPair(HArray, s)")--- U.Expect_ e1 e2 ->- case typ0 of- SProb -> do- TypedAST typ1 e1' <- inferType_ e1- case typ1 of- SMeasure typ2 -> do- e2' <- checkBinder typ2 typ0 e2- return $ syn (Expect :$ e1' :* e2' :* End)- _ -> typeMismatch sourceSpan (Left "HMeasure") (Right typ1)- _ -> typeMismatch sourceSpan (Right typ0) (Left "HProb")+ unifyMeasure typ0 sourceSpan $ \typ1 ->+ unifyPair typ1 sourceSpan $ \aa s ->+ unifyArray aa sourceSpan $ \a -> do+ e1' <- checkType_ SNat e1+ e2' <- checkType_ s e2+ e3' <- checkBinder s (SMeasure $ sPair a s) e3+ return $ syn (Chain :$ e1' :* e2' :* e3' :* End) - U.Observe_ e1 e2 ->- case typ0 of- SMeasure typ2 -> do- e1' <- checkType_ typ0 e1- e2' <- checkType_ typ2 e2- return $ syn (Observe :$ e1' :* e2' :* End)- _ -> typeMismatch sourceSpan (Right typ0) (Left "HMeasure")+ U.Transform_ tr es -> checkTransform sourceSpan typ0 tr es U.Superpose_ pes ->- case typ0 of- SMeasure _ ->+ unifyMeasure typ0 sourceSpan $ \_ -> fmap (syn . Superpose_) . T.forM pes $ \(p,e) -> (,) <$> checkType_ SProb p <*> checkType_ typ0 e- _ -> typeMismatch sourceSpan (Right typ0) (Left "HMeasure") U.Reject_ ->- case typ0 of- SMeasure _ -> return $ syn (Reject_ typ0)- _ -> typeMismatch sourceSpan (Right typ0) (Left "HMeasure")+ unifyMeasure typ0 sourceSpan $ \_ ->+ return $ syn (Reject_ typ0) + U.InjTyped t ->+ let typ1 = typeOf $ triv t+ in case jmEq1 typ0 typ1 of+ Just Refl -> return t+ Nothing -> typeMismatch sourceSpan (Right typ0) (Right typ1)+ _ | inferable e0 -> do TypedAST typ' e0' <- inferType_ e0 mode <- getMode@@ -1535,7 +1228,69 @@ UnsafeMode -> checkOrUnsafeCoerce sourceSpan e0' typ' typ0 | otherwise -> error "checkType: missing an mustCheck branch!" + checkTransform+ :: Maybe U.SourceSpan+ -> Sing x'+ -> Transform as x+ -> U.SArgs U.U_ABT as+ -> TypeCheckMonad (abt '[] x')+ checkTransform sourceSpan typ0+ Expect+ ((Nil2, e1) U.:* (Cons2 U.ToU Nil2, e2) U.:* U.End) =+ case typ0 of+ SProb -> do+ TypedAST typ1 e1' <- inferType_ e1+ unifyMeasure typ1 sourceSpan $ \typ2 -> do+ e2' <- checkBinder typ2 typ0 e2+ return $ syn (Transform_ Expect :$ e1' :* e2' :* End)+ _ -> typeMismatch sourceSpan (Right typ0) (Left "HProb") + checkTransform sourceSpan typ0+ Observe+ ((Nil2, e1) U.:* (Nil2, e2) U.:* U.End) =+ unifyMeasure typ0 sourceSpan $ \typ2 -> do+ e1' <- checkType_ typ0 e1+ e2' <- checkType_ typ2 e2+ return $ syn (Transform_ Observe :$ e1' :* e2' :* End)++ checkTransform sourceSpan typ0+ MCMC+ ((Nil2, e1) U.:* (Nil2, e2) U.:* U.End) =+ unifyFun typ0 sourceSpan $ \typa typmb ->+ unifyMeasure typmb sourceSpan $ \typb ->+ matchTypes typa typb sourceSpan (SFun typa (SMeasure typa)) typ0 $ do+ e1' <- checkType (SFun typa (SMeasure typa)) e1+ e2' <- checkType (SMeasure typa) e2+ return $ syn $ Transform_ MCMC :$ e1' :* e2' :* End++ checkTransform sourceSpan typ0+ (Disint k)+ ((Nil2, e1) U.:* U.End) =+ unifyFun typ0 sourceSpan $ \typa typmb ->+ unifyMeasure typmb sourceSpan $ \typb -> do+ e1' <- checkType (SMeasure (sPair typa typb)) e1+ return $ syn $ Transform_ (Disint k) :$ e1' :* End++ checkTransform sourceSpan typ0+ Simplify+ ((Nil2, e1) U.:* U.End) = do+ e1' <- checkType_ typ0 e1+ return $ syn (Transform_ Simplify :$ e1' :* End)++ checkTransform sourceSpan typ0+ Reparam+ ((Nil2, e1) U.:* U.End) = do+ e1' <- checkType_ typ0 e1+ return $ syn (Transform_ Reparam :$ e1' :* End)++ checkTransform sourceSpan typ0+ Summarize+ ((Nil2, e1) U.:* U.End) = do+ e1' <- checkType_ typ0 e1+ return $ syn (Transform_ Summarize :$ e1' :* End)++ checkTransform _ _ tr _ = error $ "checkTransform{" ++ show tr ++ "}: TODO"+ -------------------------------------------------------- -- We make these local to 'checkType' for the same reason we have 'checkType_' -- TODO: can we combine these in with the 'checkBranch' functions somehow?@@ -1591,32 +1346,6 @@ case typ of SKonst typ1 -> Konst <$> checkType_ typ1 e1 _ -> failwith_ "expected datum of `K' type"---------------------------------------------------------------------- BUG: haddock doesn't like annotations on GADT constructors. So--- here we'll avoid using the GADT syntax, even though it'd make--- the data type declaration prettier\/cleaner.--- <https://github.com/hakaru-dev/hakaru/issues/6>-data SomePattern (a :: Hakaru) =- forall vars.- SP !(Pattern vars a)- !(List1 Variable vars)--data SomePatternCode xss t =- forall vars.- SPC !(PDatumCode xss vars (HData' t))- !(List1 Variable vars)--data SomePatternStruct xs t =- forall vars.- SPS !(PDatumStruct xs vars (HData' t))- !(List1 Variable vars)--data SomePatternFun x t =- forall vars.- SPF !(PDatumFun x vars (HData' t))- !(List1 Variable vars) checkBranch :: (ABT Term abt)
+ haskell/Language/Hakaru/Syntax/TypeCheck/TypeCheckMonad.hs view
@@ -0,0 +1,418 @@+{-# LANGUAGE CPP+ , ScopedTypeVariables+ , GADTs+ , DataKinds+ , KindSignatures+ , GeneralizedNewtypeDeriving+ , TypeOperators+ , FlexibleContexts+ , FlexibleInstances+ , OverloadedStrings+ , PatternGuards+ , Rank2Types+ #-}++{-# OPTIONS_GHC -Wall -fwarn-tabs #-}+----------------------------------------------------------------+-- |+-- Module : Language.Hakaru.Syntax.TypeCheck+-- Copyright : Copyright (c) 2017 the Hakaru team+-- License : BSD3+-- Stability : experimental+-- Portability : GHC-only+--+-- Bidirectional type checking for our AST.+----------------------------------------------------------------+module Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad where++import Prelude hiding (id, (.))+import Control.Category+import Data.Proxy (KProxy(..))+import Data.Text (Text())+import qualified Data.Vector as V+#if __GLASGOW_HASKELL__ < 710+import Control.Applicative (Applicative(..), (<$>))+import Data.Monoid (Monoid(..))+#endif+import qualified Language.Hakaru.Parser.AST as U++import Language.Hakaru.Syntax.IClasses+import Language.Hakaru.Types.DataKind (Hakaru(..), HData', HBool)+import Language.Hakaru.Types.Sing+import Language.Hakaru.Types.Coercion+import Language.Hakaru.Types.HClasses+ ( HEq, hEq_Sing, HOrd, hOrd_Sing, HSemiring, hSemiring_Sing+ , hRing_Sing, sing_HRing, hFractional_Sing)+import Language.Hakaru.Syntax.ABT+import Language.Hakaru.Syntax.Datum+import Language.Hakaru.Syntax.Reducer+import Language.Hakaru.Syntax.AST+import Language.Hakaru.Pretty.Concrete (prettyTypeT)++-- | * Definition of the typechecking monad and related+-- types\/functions\/instances.++type Input = Maybe (V.Vector Text)++type Ctx = VarSet ('KProxy :: KProxy Hakaru)++data TypeCheckMode = StrictMode | LaxMode | UnsafeMode+ deriving (Read, Show)++type TypeCheckError = Text++newtype TypeCheckMonad a =+ TCM { unTCM :: Ctx+ -> Input+ -> TypeCheckMode+ -> Either TypeCheckError a }++runTCM :: TypeCheckMonad a -> Input -> TypeCheckMode -> Either TypeCheckError a+runTCM m = unTCM m emptyVarSet++instance Functor TypeCheckMonad where+ fmap f m = TCM $ \ctx input mode -> fmap f (unTCM m ctx input mode)++instance Applicative TypeCheckMonad where+ pure x = TCM $ \_ _ _ -> Right x+ mf <*> mx = mf >>= \f -> fmap f mx++-- TODO: ensure this instance has the appropriate strictness+instance Monad TypeCheckMonad where+ return = pure+ mx >>= k =+ TCM $ \ctx input mode ->+ unTCM mx ctx input mode >>= \x ->+ unTCM (k x) ctx input mode++{-+-- We could provide this instance, but there's no decent error+-- message to give for the 'empty' case that works in all circumstances.+-- Because we only would need this to define 'inferOneCheckOthers',+-- we inline the definition there instead.+instance Alternative TypeCheckMonad where+ empty = failwith "Alternative.empty"+ x <|> y = TCM $ \ctx mode ->+ case unTCM x ctx mode of+ Left _ -> unTCM y ctx mode+ Right e -> Right e+-}++-- | Return the mode in which we're checking\/inferring types.+getInput :: TypeCheckMonad Input+getInput = TCM $ \_ input _ -> Right input++-- | Return the mode in which we're checking\/inferring types.+getMode :: TypeCheckMonad TypeCheckMode+getMode = TCM $ \_ _ mode -> Right mode++-- | Extend the typing context, but only locally.+pushCtx+ :: Variable (a :: Hakaru)+ -> TypeCheckMonad b+ -> TypeCheckMonad b+pushCtx x (TCM m) = TCM (m . insertVarSet x)++getCtx :: TypeCheckMonad Ctx+getCtx = TCM $ \ctx _ _ -> Right ctx++failwith :: TypeCheckError -> TypeCheckMonad r+failwith e = TCM $ \_ _ _ -> Left e++failwith_ :: TypeCheckError -> TypeCheckMonad r+failwith_ = failwith++-- TODO: some day we may want a variant of this function which+-- returns the error message in the event that the computation fails+-- (e.g., to provide all of them if 'inferOneCheckOthers' ultimately+-- fails.+--+-- | a la @optional :: Alternative f => f a -> f (Maybe a)@ but+-- without needing the 'empty' of the 'Alternative' class.+try :: TypeCheckMonad a -> TypeCheckMonad (Maybe a)+try m = TCM $ \ctx input mode -> Right $+ case unTCM m ctx input mode of+ Left _ -> Nothing -- Don't worry; no side effects to unwind+ Right e -> Just e++-- | Tries to typecheck in a given mode+tryWith :: TypeCheckMode -> TypeCheckMonad a -> TypeCheckMonad (Maybe a)+tryWith mode m = TCM $ \ctx input _ -> Right $+ case unTCM m ctx input mode of+ Left _ -> Nothing+ Right e -> Just e++-- | * Helpers for constructing error messages++makeErrMsg+ :: Text+ -> Maybe U.SourceSpan+ -> Text+ -> TypeCheckMonad TypeCheckError+makeErrMsg header sourceSpan footer = do+ input_ <- getInput+ case (sourceSpan, input_) of+ (Just s, Just input) ->+ return $ mconcat [ header+ , "\n"+ , U.printSourceSpan s input+ , footer+ ]+ _ ->+ return $ mconcat [ header, "\n", footer ]++-- | Fail with a type-mismatch error.+typeMismatch+ :: Maybe U.SourceSpan+ -> Either Text (Sing (a :: Hakaru))+ -> Either Text (Sing (b :: Hakaru))+ -> TypeCheckMonad r+typeMismatch s typ1 typ2 = failwith =<<+ makeErrMsg+ "Type Mismatch:"+ s+ (mconcat [ "expected "+ , msg1+ , ", found "+ , msg2+ ])+ where+ msg1 = case typ1 of { Left msg -> msg; Right typ -> prettyTypeT typ }+ msg2 = case typ2 of { Left msg -> msg; Right typ -> prettyTypeT typ }++missingInstance+ :: Text+ -> Sing (a :: Hakaru)+ -> Maybe U.SourceSpan+ -> TypeCheckMonad r+missingInstance clas typ s = failwith =<<+ makeErrMsg+ "Missing Instance:"+ s+ (mconcat $ ["No ", clas, " instance for type ", prettyTypeT typ])++missingLub+ :: Sing (a :: Hakaru)+ -> Sing (b :: Hakaru)+ -> Maybe U.SourceSpan+ -> TypeCheckMonad r+missingLub typ1 typ2 s = failwith =<<+ makeErrMsg+ "Missing common type:"+ s+ (mconcat ["No lub of types ", prettyTypeT typ1, " and ", prettyTypeT typ2])++-- we can't have free variables, so it must be a typo+ambiguousFreeVariable+ :: Text+ -> Maybe U.SourceSpan+ -> TypeCheckMonad r+ambiguousFreeVariable x s = failwith =<<+ makeErrMsg+ (mconcat $ ["Name not in scope: ", x])+ s+ "Perhaps it is a typo?"++ambiguousNullCoercion+ :: Maybe U.SourceSpan+ -> TypeCheckMonad r+ambiguousNullCoercion s = failwith =<<+ makeErrMsg+ "Cannot infer type for null-coercion over a checking term."+ s+ "Please add a type annotation to either the term being coerced or the result of the coercion."++ambiguousEmptyNary+ :: Maybe U.SourceSpan+ -> TypeCheckMonad r+ambiguousEmptyNary s = failwith =<<+ makeErrMsg+ "Cannot infer unambiguous type for empty n-ary operator."+ s+ "Try adding an annotation on the result of the operator."++ambiguousMustCheckNary+ :: Maybe U.SourceSpan+ -> TypeCheckMonad r+ambiguousMustCheckNary s = failwith =<<+ makeErrMsg+ "Could not infer any of the arguments."+ s+ "Try adding a type annotation to at least one of them."++ambiguousMustCheck+ :: Maybe U.SourceSpan+ -> TypeCheckMonad r+ambiguousMustCheck s = failwith =<<+ makeErrMsg+ "Cannot infer types for checking terms."+ s+ "Please add a type annotation."++argumentNumberError+ :: TypeCheckMonad r+argumentNumberError = failwith =<<+ makeErrMsg "Argument error:" Nothing "Passed wrong number of arguments"++-- | * Terms whose type is existentially quantified packed with a singleton for+-- the type.++-- BUG: haddock doesn't like annotations on GADT constructors. So+-- here we'll avoid using the GADT syntax, even though it'd make+-- the data type declaration prettier\/cleaner.+-- <https://github.com/hakaru-dev/hakaru/issues/6>+--+-- | The @e' ∈ τ@ portion of the inference judgement.+data TypedAST (abt :: [Hakaru] -> Hakaru -> *)+ = forall b. TypedAST !(Sing b) !(abt '[] b)++onTypedAST :: (forall b . abt '[] b -> abt '[] b) -> TypedAST abt -> TypedAST abt+onTypedAST f (TypedAST t p) = TypedAST t (f p)++onTypedASTM :: (Functor m)+ => (forall b . abt '[] b -> m (abt '[] b))+ -> TypedAST abt -> m (TypedAST abt)+onTypedASTM f (TypedAST t p) = TypedAST t <$> f p++elimTypedAST :: (forall b . Sing b -> abt '[] b -> x) -> TypedAST abt -> x +elimTypedAST f (TypedAST t p) = f t p ++instance Show2 abt => Show (TypedAST abt) where+ showsPrec p (TypedAST typ e) =+ showParen_12 p "TypedAST" typ e+++----------------------------------------------------------------+data TypedASTs (abt :: [Hakaru] -> Hakaru -> *)+ = forall b. TypedASTs !(Sing b) [abt '[] b]++{-+instance Show2 abt => Show (TypedASTs abt) where+ showsPrec p (TypedASTs typ es) =+ showParen_1x p "TypedASTs" typ es+-}++----------------------------------------------------------------+-- HACK: Passing this list of variables feels like a hack+-- it would be nice if it could be removed from this datatype+data TypedReducer (abt :: [Hakaru] -> Hakaru -> *)+ (xs :: [Hakaru])+ = forall b. TypedReducer !(Sing b) (List1 Variable xs) (Reducer abt xs b)++----------------------------------------------------------------+-- BUG: haddock doesn't like annotations on GADT constructors. So+-- here we'll avoid using the GADT syntax, even though it'd make+-- the data type declaration prettier\/cleaner.+-- <https://github.com/hakaru-dev/hakaru/issues/6>+data SomePattern (a :: Hakaru) =+ forall vars.+ SP !(Pattern vars a)+ !(List1 Variable vars)++data SomePatternCode xss t =+ forall vars.+ SPC !(PDatumCode xss vars (HData' t))+ !(List1 Variable vars)++data SomePatternStruct xs t =+ forall vars.+ SPS !(PDatumStruct xs vars (HData' t))+ !(List1 Variable vars)++data SomePatternFun x t =+ forall vars.+ SPF !(PDatumFun x vars (HData' t))+ !(List1 Variable vars)++data SomeBranch a abt = forall b. SomeBranch !(Sing b) [Branch a abt b]++-- | * Misc.++makeVar :: forall (a :: Hakaru). Variable 'U.U -> Sing a -> Variable a+makeVar (Variable hintID nameID _) typ =+ Variable hintID nameID typ++make_NaryOp :: Sing a -> U.NaryOp -> TypeCheckMonad (NaryOp a)+make_NaryOp a U.And = isBool a >>= \Refl -> return And+make_NaryOp a U.Or = isBool a >>= \Refl -> return Or+make_NaryOp a U.Xor = isBool a >>= \Refl -> return Xor+make_NaryOp a U.Iff = isBool a >>= \Refl -> return Iff+make_NaryOp a U.Min = Min <$> getHOrd a+make_NaryOp a U.Max = Max <$> getHOrd a+make_NaryOp a U.Sum = Sum <$> getHSemiring a+make_NaryOp a U.Prod = Prod <$> getHSemiring a++isBool :: Sing a -> TypeCheckMonad (TypeEq a HBool)+isBool typ =+ case jmEq1 typ sBool of+ Just proof -> return proof+ Nothing -> typeMismatch Nothing (Left "HBool") (Right typ)+++jmEq1_ :: Sing (a :: Hakaru)+ -> Sing (b :: Hakaru)+ -> TypeCheckMonad (TypeEq a b)+jmEq1_ typA typB =+ case jmEq1 typA typB of+ Just proof -> return proof+ Nothing -> typeMismatch Nothing (Right typA) (Right typB)+++getHEq :: Sing a -> TypeCheckMonad (HEq a)+getHEq typ =+ case hEq_Sing typ of+ Just theEq -> return theEq+ Nothing -> missingInstance "HEq" typ Nothing++getHOrd :: Sing a -> TypeCheckMonad (HOrd a)+getHOrd typ =+ case hOrd_Sing typ of+ Just theOrd -> return theOrd+ Nothing -> missingInstance "HOrd" typ Nothing++getHSemiring :: Sing a -> TypeCheckMonad (HSemiring a)+getHSemiring typ =+ case hSemiring_Sing typ of+ Just theSemi -> return theSemi+ Nothing -> missingInstance "HSemiring" typ Nothing++getHRing :: Sing a -> TypeCheckMode -> TypeCheckMonad (SomeRing a)+getHRing typ mode =+ case mode of+ StrictMode -> case hRing_Sing typ of+ Just theRing -> return (SomeRing theRing CNil)+ Nothing -> missingInstance "HRing" typ Nothing+ LaxMode -> case findRing typ of+ Just proof -> return proof+ Nothing -> missingInstance "HRing" typ Nothing+ UnsafeMode -> case findRing typ of+ Just proof -> return proof+ Nothing -> missingInstance "HRing" typ Nothing++getHFractional :: Sing a -> TypeCheckMode -> TypeCheckMonad (SomeFractional a)+getHFractional typ mode =+ case mode of+ StrictMode -> case hFractional_Sing typ of+ Just theFrac -> return (SomeFractional theFrac CNil)+ Nothing -> missingInstance "HFractional" typ Nothing+ LaxMode -> case findFractional typ of+ Just proof -> return proof+ Nothing -> missingInstance "HFractional" typ Nothing+ UnsafeMode -> case findFractional typ of+ Just proof -> return proof+ Nothing -> missingInstance "HFractional" typ Nothing++-- TODO: find a better name, and move to where 'LC_' is defined.+lc :: (LC_ abt a -> LC_ abt b) -> abt '[] a -> abt '[] b+lc f = unLC_ . f . LC_++coerceTo_nonLC :: (ABT Term abt) => Coercion a b -> abt xs a -> abt xs b+coerceTo_nonLC = underBinders . lc . coerceTo++coerceFrom_nonLC :: (ABT Term abt) => Coercion a b -> abt xs b -> abt xs a+coerceFrom_nonLC = underBinders . lc . coerceFrom++-- BUG: how to make this not an orphan, without dealing with cyclic imports between AST.hs (for the 'LC_' instance), Datum.hs, and Coercion.hs?+instance (ABT Term abt) => Coerce (Branch a abt) where+ coerceTo c (Branch pat e) = Branch pat (coerceTo_nonLC c e)+ coerceFrom c (Branch pat e) = Branch pat (coerceFrom_nonLC c e)
+ haskell/Language/Hakaru/Syntax/TypeCheck/Unification.hs view
@@ -0,0 +1,113 @@+{-# LANGUAGE CPP+ , ScopedTypeVariables+ , GADTs+ , DataKinds+ , KindSignatures+ , GeneralizedNewtypeDeriving+ , TypeOperators+ , FlexibleContexts+ , FlexibleInstances+ , OverloadedStrings+ , PatternGuards+ , Rank2Types+ , LiberalTypeSynonyms+ #-}++{-# OPTIONS_GHC -Wall -fwarn-tabs #-}+----------------------------------------------------------------+-- |+-- Module : Language.Hakaru.Syntax.TypeCheck+-- Copyright : Copyright (c) 2017 the Hakaru team+-- License : BSD3+-- Stability : experimental+-- Portability : GHC-only+--+-- Ad-hoc implementation of unification (ad-hoc because polytypes are+-- inexpressible, and this module makes no attempt to express them).+----------------------------------------------------------------+module Language.Hakaru.Syntax.TypeCheck.Unification where++import Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad+import Language.Hakaru.Types.DataKind (Hakaru(..), HPair)+import Language.Hakaru.Types.Sing+import Language.Hakaru.Syntax.IClasses+import qualified Language.Hakaru.Parser.AST as U+import Data.Text (Text)++type Metadata = Maybe U.SourceSpan++type Unify1 (t :: Hakaru -> Hakaru) r x+ = Sing x+ -> Metadata+ -> (forall a . x ~ t a => Sing a -> TypeCheckMonad r)+ -> TypeCheckMonad r++type Unify2 (t :: Hakaru -> Hakaru -> Hakaru) r x+ = Sing x+ -> Metadata+ -> (forall a b . x ~ t a b => Sing a -> Sing b -> TypeCheckMonad r)+ -> TypeCheckMonad r++class TCMTypeRepr x where+ toTypeRepr :: x -> Maybe (Either Text (Some1 (Sing :: Hakaru -> *)))++instance TCMTypeRepr (Sing (x :: Hakaru)) where+ toTypeRepr = Just . Right . Some1++instance TCMTypeRepr Text where+ toTypeRepr = Just . Left++instance TCMTypeRepr () where+ toTypeRepr () = Nothing++unifyMeasure :: Unify1 'HMeasure r x+unifyMeasure ty m k =+ case ty of+ SMeasure a -> k a+ _ -> typeMismatch m (Left "HMeasure") (Right ty)++unifyArray :: Unify1 'HArray r x+unifyArray ty m k =+ case ty of+ SArray a -> k a+ _ -> typeMismatch m (Left "HArray") (Right ty)++unifyFun :: Unify2 '(:->) r x+unifyFun ty m k =+ case ty of+ SFun a b -> k a b+ _ -> typeMismatch m (Left ":->") (Right ty)++unifyPair :: Unify2 HPair r x+unifyPair ty m k =+ maybe (typeMismatch m (Left "HPair") (Right ty)) id $ do+ SData (STyCon sym `STyApp` a `STyApp` b) _ <- Just ty+ Refl <- jmEq1 sym sSymbol_Pair+ Just $ k a b++matchTypes+ :: (TCMTypeRepr t0, TCMTypeRepr t1)+ => Sing (x :: Hakaru)+ -> Sing y+ -> Metadata+ -> t0 -> t1+ -> (x ~ y => TypeCheckMonad r)+ -> TypeCheckMonad r+matchTypes t0 t1 m e0 e1 k+ | Just Refl <- jmEq1 t0 t1 = k+ | otherwise =+ let tyRepr+ :: TCMTypeRepr t+ => Sing (x :: Hakaru)+ -> t+ -> Either Text (Some1 (Sing :: Hakaru -> *))+ tyRepr d = maybe (Right $ Some1 d) id . toTypeRepr+ err = typeMismatch m+ err :: Either Text (Sing (x :: Hakaru))+ -> Either Text (Sing (y :: Hakaru))+ -> TypeCheckMonad r+ in case (tyRepr t0 e0, tyRepr t1 e1) of+ (Left a, Left b) -> err (Left a) (Left b)+ (Left a, Right (Some1 b)) -> err (Left a) (Right b)+ (Right (Some1 a), Left b) -> err (Right a) (Left b)+ (Right (Some1 a), Right (Some1 b)) -> err (Right a) (Right b)
haskell/Language/Hakaru/Syntax/TypeOf.hs view
@@ -5,6 +5,8 @@ , ScopedTypeVariables , Rank2Types , FlexibleContexts+ , PolyKinds+ , ViewPatterns #-} {-# OPTIONS_GHC -Wall -fwarn-tabs #-}@@ -26,7 +28,6 @@ -- * Get singletons for well-typed ABTs typeOf , typeOfReducer- -- * Implementation details , getTermSing ) where@@ -46,7 +47,9 @@ (singCoerceCod, singCoerceDom, Coerce(..)) import Language.Hakaru.Syntax.Datum (Datum(..), Branch(..)) import Language.Hakaru.Syntax.Reducer-import Language.Hakaru.Syntax.AST (Term(..), SCon(..), SArgs(..))+import Language.Hakaru.Syntax.AST (Term(..), SCon(..), SArgs(..)+ ,typeOfTransform+ ,getSArgsSing) import Language.Hakaru.Syntax.AST.Sing (sing_PrimOp, sing_ArrayOp, sing_MeasureOp, sing_NaryOp, sing_Literal) @@ -157,9 +160,7 @@ SFun (varType x) <$> getSing r1 go (App_ :$ r1 :* _ :* End) = do typ1 <- getSing r1- case typ1 of- SFun _ typ3 -> return typ3- _ -> error "getTermSing: the impossible happened"+ case typ1 of SFun _ typ3 -> return typ3 go (Let_ :$ _ :* r2 :* End) = getSing r2 go (CoerceTo_ c :$ r1 :* End) = maybe (coerceTo c <$> getSing r1) return (singCoerceCod c)@@ -175,8 +176,8 @@ go (Integrate :$ _) = return SProb go (Summate _ h :$ _) = return $ sing_HSemiring h go (Product _ h :$ _) = return $ sing_HSemiring h- go (Expect :$ _) = return SProb- go (Observe :$ r1 :* _ :* End) = getSing r1+ go (Transform_ t :$ as) =+ typeOfTransform t <$> getSArgsSing getSing as go (NaryOp_ o _) = return $ sing_NaryOp o go (Literal_ v) = return $ sing_Literal v go (Empty_ typ) = return typ@@ -188,7 +189,6 @@ go (Superpose_ pes) = tryAll "Superpose_" (getSing . snd) pes go (Reject_ typ) = return typ go (_ :$ _) = error "getTermSing: the impossible happened"- tryAll :: F.Foldable f
haskell/Language/Hakaru/Syntax/Uniquify.hs view
@@ -41,7 +41,6 @@ import Language.Hakaru.Syntax.AST.Eq (Varmap) import Language.Hakaru.Syntax.Gensym import Language.Hakaru.Syntax.IClasses-import Debug.Trace #if __GLASGOW_HASKELL__ < 710 import Control.Applicative
haskell/Language/Hakaru/Syntax/Value.hs view
@@ -20,13 +20,13 @@ import qualified Data.Vector as V import qualified Data.Number.LogFloat as LF-import Data.Number.Nat+import Data.Number.Natural import qualified System.Random.MWC as MWC data Value :: Hakaru -> * where- VNat :: {-# UNPACK #-} !Nat -> Value 'HNat- VInt :: {-# UNPACK #-} !Int -> Value 'HInt+ VNat :: !Natural -> Value 'HNat+ VInt :: !Integer -> Value 'HInt VProb :: {-# UNPACK #-} !LF.LogFloat -> Value 'HProb VReal :: {-# UNPACK #-} !Double -> Value 'HReal @@ -79,28 +79,25 @@ instance PrimCoerce Value where primCoerceTo c l = case (c,l) of- (Signed HRing_Int, VNat a) -> VInt $ fromNat a+ (Signed HRing_Int, VNat a) -> VInt $ fromNatural a (Signed HRing_Real, VProb a) -> VReal $ LF.fromLogFloat a (Continuous HContinuous_Prob, VNat a) ->- VProb $ LF.logFloat (fromIntegral (fromNat a) :: Double)+ VProb $ LF.logFloat (fromIntegral (fromNatural a) :: Double) (Continuous HContinuous_Real, VInt a) -> VReal $ fromIntegral a- _ -> error "no a defined primitive coercion" primCoerceFrom c l = case (c,l) of- (Signed HRing_Int, VInt a) -> VNat $ unsafeNat a+ (Signed HRing_Int, VInt a) -> VNat $ unsafeNatural a (Signed HRing_Real, VReal a) -> VProb $ LF.logFloat a (Continuous HContinuous_Prob, VProb a) ->- VNat $ unsafeNat $ floor (LF.fromLogFloat a :: Double)+ VNat $ unsafeNatural $ floor (LF.fromLogFloat a :: Double) (Continuous HContinuous_Real, VReal a) -> VInt $ floor a- _ -> error "no a defined primitive coercion" lam2 :: Value (a ':-> b ':-> c) -> (Value a -> Value b -> Value c) lam2 (VLam f1) v1 = case f1 v1 of VLam f2 -> f2- _ -> error "lam2: the impossible happened" enumFromUntilValue :: (HDiscrete a)@@ -109,6 +106,7 @@ -> [Value a] enumFromUntilValue _ (VNat lo) (VNat hi) = map VNat (init (enumFromTo lo hi)) enumFromUntilValue _ (VInt lo) (VInt hi) = map VInt (init (enumFromTo lo hi))+enumFromUntilValue _ _ _ = error "Tried to iterate over a non-iterable value" data VReducer :: * -> Hakaru -> * where VRed_Num :: STRef s (Value a)
haskell/Language/Hakaru/Syntax/Variable.hs view
@@ -75,6 +75,10 @@ import Data.Monoid (Monoid(..)) #endif +#if !(MIN_VERSION_base(4,11,0))+import Data.Semigroup+#endif+ import Data.Number.Nat import Language.Hakaru.Syntax.IClasses -- TODO: factor the definition of the 'Sing' type family out from@@ -375,9 +379,14 @@ someVariables Nil1 = [] someVariables (Cons1 x xs) = SomeVariable x : someVariables xs +instance Semigroup (VarSet kproxy) where+ VarSet xs <> VarSet ys = VarSet (IM.union xs ys) -- TODO: remove bias; crash if conflicting definitions+ instance Monoid (VarSet kproxy) where- mempty = emptyVarSet- mappend (VarSet xs) (VarSet ys) = VarSet (IM.union xs ys) -- TODO: remove bias; crash if conflicting definitions+ mempty = emptyVarSet+#if !(MIN_VERSION_base(4,11,0))+ mappend = (<>)+#endif mconcat = VarSet . IM.unions . map unVarSet varSetKeys :: VarSet a -> [Int]@@ -522,12 +531,15 @@ go m Nil1 Nil1 = m go m (Cons1 x xs) (Cons1 e es) = go (IM.insert (fromNat $ varID x) (Assoc x e) m) xs es- go _ _ _ = error "toAssocs1: the impossible happened" +instance Semigroup (Assocs abt) where+ Assocs xs <> Assocs ys = Assocs (IM.union xs ys) -- TODO: remove bias; crash if conflicting definitions instance Monoid (Assocs abt) where- mempty = emptyAssocs- mappend (Assocs xs) (Assocs ys) = Assocs (IM.union xs ys) -- TODO: remove bias; crash if conflicting definitions+ mempty = emptyAssocs+#if !(MIN_VERSION_base(4,11,0))+ mappend = (<>)+#endif mconcat = Assocs . IM.unions . map unAssocs
haskell/Language/Hakaru/Types/Coercion.hs view
@@ -124,6 +124,8 @@ -- order to get a better inductive hypothesis. CCons :: !(PrimCoercion a b) -> !(Coercion b c) -> Coercion a c +infixr 5 `CCons`+ -- TODO: instance Read (Coercion a b) deriving instance Show (Coercion a b)
haskell/Language/Hakaru/Types/HClasses.hs view
@@ -91,10 +91,11 @@ #if __GLASGOW_HASKELL__ < 710 import Data.Functor ((<$>)) #endif-import Control.Applicative ((<|>))+import Control.Applicative ((<|>), (<*>)) import Language.Hakaru.Syntax.IClasses (TypeEq(..), Eq1(..), JmEq1(..)) import Language.Hakaru.Types.DataKind import Language.Hakaru.Types.Sing+import Control.Monad (join) ---------------------------------------------------------------- -- | Concrete dictionaries for Hakaru types with decidable equality.@@ -132,12 +133,13 @@ hEq_Sing SProb = Just HEq_Prob hEq_Sing SReal = Just HEq_Real hEq_Sing (SArray a) = HEq_Array <$> hEq_Sing a-hEq_Sing s = (jmEq1 s sUnit >>= \Refl -> Just HEq_Unit) <|>- (jmEq1 s sBool >>= \Refl -> Just HEq_Bool)-{--hEq_Sing (sPair a b) = HEq_Pair <$> hEq_Sing a <*> hEq_Sing b-hEq_Sing (sEither a b) = HEq_Either <$> hEq_Sing a <*> hEq_Sing b--}+hEq_Sing s =+ (jmEq1 s sUnit >>= \Refl -> Just HEq_Unit) <|>+ (jmEq1 s sBool >>= \Refl -> Just HEq_Bool) <|>+ (join $ sUnPair' s $ \(Refl, a, b) ->+ HEq_Pair <$> hEq_Sing a <*> hEq_Sing b) <|>+ (join $ sUnEither' s $ \(Refl, a, b) ->+ HEq_Either <$> hEq_Sing a <*> hEq_Sing b) -- | Haskell type class for automatic 'HEq' inference. class HEq_ (a :: Hakaru) where hEq :: HEq a
haskell/Language/Hakaru/Types/Sing.hs view
@@ -25,7 +25,7 @@ ---------------------------------------------------------------- module Language.Hakaru.Types.Sing ( Sing(..)- , SingI(..)+ , SingI(..), singOf -- * Some helpful shorthands for \"built-in\" datatypes -- ** Constructing singletons , sBool@@ -37,10 +37,11 @@ -- ** Destructing singletons , sUnMeasure , sUnArray- , sUnPair- , sUnEither+ , sUnPair, sUnPair'+ , sUnEither, sUnEither' , sUnList , sUnMaybe+ , sUnFun -- ** Singletons for `Symbol` , someSSymbol, ssymbolVal , sSymbol_Bool@@ -73,6 +74,9 @@ -- Hakaru type. class SingI (a :: k) where sing :: Sing a +singOf :: SingI a => proxy a -> Sing a+singOf _ = sing+ {- -- TODO: we'd much rather have something like this, to prove that -- we have a SingI instance for /every/ @a :: Hakaru@. Is there any@@ -197,6 +201,14 @@ sUnPair (SData (STyApp (STyApp (STyCon _) a) b) _) = (a,b) sUnPair _ = error "sUnPair: the impossible happened" +sUnPair' :: Sing (x :: Hakaru)+ -> (forall (a :: Hakaru) (b :: Hakaru) .+ (TypeEq x (HPair a b), Sing a, Sing b) -> r)+ -> Maybe r+sUnPair' (SData (STyApp (STyApp (STyCon t) a) b) _) k+ | Just Refl <- jmEq1 t sSymbol_Pair = Just $ k (Refl, a, b)+sUnPair' _ _ = Nothing+ sEither :: Sing a -> Sing b -> Sing (HEither a b) sEither a b = SData (STyCon sSymbol_Either `STyApp` a `STyApp` b)@@ -207,6 +219,14 @@ sUnEither (SData (STyApp (STyApp (STyCon _) a) b) _) = (a,b) sUnEither _ = error "sUnEither: the impossible happened" +sUnEither' :: Sing (x :: Hakaru)+ -> (forall (a :: Hakaru) (b :: Hakaru) .+ (TypeEq x (HEither a b), Sing a, Sing b) -> r)+ -> Maybe r+sUnEither' (SData (STyApp (STyApp (STyCon t) a) b) _) k+ | Just Refl <- jmEq1 t sSymbol_Either = Just $ k (Refl, a, b)+sUnEither' _ _ = Nothing+ sList :: Sing a -> Sing (HList a) sList a = SData (STyCon sSymbol_List `STyApp` a)@@ -224,6 +244,9 @@ sUnMaybe :: Sing (HMaybe a) -> Sing a sUnMaybe (SData (STyApp (STyCon _) a) _) = a sUnMaybe _ = error "sUnMaybe: the impossible happened"++sUnFun :: Sing (a ':-> b) -> (Sing a, Sing b)+sUnFun (SFun a b) = (a,b) ---------------------------------------------------------------- data instance Sing (a :: HakaruCon) where
haskell/Tests/Parser.hs view
@@ -5,13 +5,15 @@ import Prelude hiding (unlines) -import Language.Hakaru.Parser.Parser+import Language.Hakaru.Parser.Parser (parseHakaru) import Language.Hakaru.Parser.AST +import Data.String (IsString) import Data.Text import Test.HUnit import Test.QuickCheck.Arbitrary import Test.QuickCheck+import Data.Function (on) #if __GLASGOW_HASKELL__ < 710 import Control.Applicative (Applicative(..), (<$>))@@ -53,10 +55,10 @@ , PData' <$> (DV <$> arbitrary <*> arbitrary) ] -instance Arbitrary a => Arbitrary (Branch' a) where+instance (Arbitrary a, IsString a) => Arbitrary (Branch' a) where arbitrary = Branch' <$> arbitrary <*> arbitrary -instance Arbitrary a => Arbitrary (AST' a) where+instance (Arbitrary a, IsString a) => Arbitrary (AST' a) where arbitrary = frequency [ (10, Var <$> arbitrary) , ( 1, Lam <$> arbitrary <*> arbitrary <*> arbitrary)@@ -67,9 +69,9 @@ , ( 1, return Infinity') , ( 1, ULiteral <$> arbitrary) --, ( 1, NaryOp <$> arbitrary)- , ( 1, return Empty)+ , ( 1, return (ArrayLiteral [])) , ( 1, Case <$> arbitrary <*> arbitrary)- , ( 1, Dirac <$> arbitrary)+ , ( 1, App (Var "dirac") <$> arbitrary) , ( 1, Bind <$> arbitrary <*> arbitrary <*> arbitrary) ] @@ -77,7 +79,7 @@ testParse s p = case parseHakaru s of Left m -> assertFailure (unpack s ++ "\n" ++ show m)- Right p' -> assertEqual "" p p'+ Right p' -> assertEqual "" (withoutMetaE p) (withoutMetaE p') if1, if2, if3, if4, if5 :: Text @@ -160,7 +162,7 @@ ["def foo(x real):" ," y <~ normal(x,1.0)" ," return (y + y. real)"- ,"foo(-2.0)"+ ,"foo(-(2.0))" ] def4 :: Text@@ -180,7 +182,7 @@ def2AST = Let "foo" (Lam "x" (TypeVar "real") (Bind "y" (App (App (Var "normal") (Var "x")) (ULiteral (Prob 1.0)))- (Dirac (Ann (NaryOp Sum [Var "y", Var "y"])+ (App (Var "dirac") (Ann (NaryOp Sum [Var "y", Var "y"]) (TypeVar "real"))))) (App (Var "foo") (App (Var "negate") (ULiteral (Prob 2.0)))) @@ -240,13 +242,13 @@ (Bind "y" (App (App (Var "normal") (Var "x")) (ULiteral (Nat 1)))- (Dirac (Var "y")))+ (App (Var "dirac") (Var "y"))) ret1 :: Text ret1 = "return return 3" ret1AST :: AST' Text-ret1AST = Dirac (Dirac (ULiteral (Nat 3)))+ret1AST = App (Var "dirac") (App (Var "dirac") (ULiteral (Nat 3))) testBinds :: Test testBinds = test@@ -345,7 +347,7 @@ match7AST :: AST' Text match7AST = Case (Ann (Pair- (App (Var "negate") (ULiteral (Prob 2.0)))+ (ULiteral (Real (-2.0))) (ULiteral (Prob 1.0))) (TypeApp "pair" [TypeVar "real",TypeVar "prob"])) [Branch' (PData' (DV "pair" [PVar' "a",PVar' "b"]))@@ -393,24 +395,24 @@ expect1 :: Text expect1 = unlines- ["expect x normal(0,1):"+ ["expect x <~ normal(0,1):" ," 1" ] expect1AST :: AST' Text-expect1AST = Expect "x" (App (App (Var "normal")+expect1AST = _Expect "x" (App (App (Var "normal") (ULiteral (Nat 0))) (ULiteral (Nat 1))) (ULiteral (Nat 1)) expect2 :: Text expect2 = unlines- ["expect x normal(0,1):"+ ["expect x <~ normal(0,1):" ," unsafeProb(x*x)" ] expect2AST :: AST' Text-expect2AST = Expect "x" (App (App (Var "normal")+expect2AST = _Expect "x" (App (App (Var "normal") (ULiteral (Nat 0))) (ULiteral (Nat 1))) (App (Var "unsafeProb")@@ -505,7 +507,7 @@ (Bind "m2" (App (App (Var "normal") (Var "x2")) (Var "noiseE"))- (Dirac+ (App (Var "dirac") (Pair (Pair (Var "m1")
+ haskell/Tests/Pretty.hs view
@@ -0,0 +1,98 @@+{-# LANGUAGE OverloadedStrings+ , DataKinds+ , GADTs+ , TypeOperators + , FlexibleContexts #-}++module Tests.Pretty where++import Language.Hakaru.Command (parseAndInfer)+import Language.Hakaru.Pretty.Concrete+import Language.Hakaru.Syntax.ABT+import Language.Hakaru.Syntax.Prelude+import Language.Hakaru.Syntax.TypeCheck+import Language.Hakaru.Types.Sing+import Language.Hakaru.Types.DataKind+import qualified Language.Hakaru.Parser.AST as U+import qualified Language.Hakaru.Syntax.AST as T+import Language.Hakaru.Syntax.IClasses+import Language.Hakaru.Types.Sing+++import Tests.TestTools +import Data.Text+import Text.PrettyPrint+import Test.HUnit+import Text.Parsec.Error+import Control.Monad.Trans.State.Strict (evalState)++import Prelude ((.), ($), asTypeOf, String, FilePath, Show(..), (++), Bool(..), concat + ,Either(..), Maybe(..))+import qualified Prelude ++allTests :: Test+allTests = test+ [ "basic let" ~: testPretty letTest + , "nested let" ~: testPretty letTest2+ , "basic fn" ~: testPretty defTest + , "nested fn" ~: testPretty defTest2+ , "fn in case" ~: testPretty' caseFn + , "fn literal in case" ~: testPretty' caseFn2 + , "hof" ~: testPretty' hof+ ]++letTest = unlines ["x = 2"+ ,"y = 3"+ ,"x"+ ]++letTest2 = unlines ["x = y = 2"+ ," y"+ ,"x"+ ]++defTest = unlines ["foo = fn x nat:"+ ," x + 2"+ ,"foo(3)"+ ]++defTest2 = unlines ["foo = fn x nat: fn y nat:"+ ," x + y"+ ,"foo(2,3)"+ ]++caseFn :: (ABT T.Term abt) => abt '[] 'HProb+caseFn = + pair (lam $ \x -> x) (lam $ \x -> x)+ `unpair` \a b -> (a `app` prob_ 1) + (b `app` prob_ 2)++caseFn2 :: (ABT T.Term abt, b ~ HProb) => abt '[] (b :-> (b :-> (b :-> b)))+caseFn2 = + lam $ \x0 ->+ let_ (lam $ \x1 ->+ (lam $ \x2 ->+ (pair (lam $ \x -> x) (prob_ 12)) `unpair` \x4 x5 -> x4 `app` (x0 + x1 + x2 + x5))) $ \x -> x ++hof :: (ABT T.Term abt, a ~ HProb) => abt '[] (a :-> a :-> a :-> (a :-> (a :-> HPair a ((a :-> a) :-> a))) :-> a)+hof = + lam $ \x0 -> lam $ \x1 -> lam $ \x3 -> lam $ \x4 -> (+ x4 `app` x0+ `app` x1 `unpair` \x2 x3 ->+ x3 `app` (lam $ \_ -> prob_ 1))++-- Tests things are parsed and prettyprinted nearly the same+testPretty :: Text -> Assertion +testPretty t =+ case parseAndInfer t of + Left err -> assertFailure ("Program failed to parse\n" ++ unpack err)+ Right (TypedAST ty ast) -> + case parseAndInfer $ pack $ show $ pretty ast of + Left err -> assertFailure ("Pretty printed program failed to parse\n" ++ unpack err)+ Right (TypedAST ty' ast') -> + Prelude.maybe + (assertFailure $ mismatchMessage (prettyType 10) "Pretty printed programs has different type!" ty ty')+ (\Refl -> assertAlphaEq "" ast ast') + (jmEq1 ty ty')++testPretty' :: TrivialABT T.Term '[] a -> Assertion +testPretty' = testPretty . pack . show . pretty
+ haskell/Tests/Relationships.hs view
@@ -0,0 +1,369 @@+{-# LANGUAGE NoImplicitPrelude+ , DataKinds+ , TypeOperators+ , TypeFamilies+ , ScopedTypeVariables+ , FlexibleContexts+ #-}+{-# OPTIONS_GHC -Wall -fwarn-tabs #-}+module Tests.Relationships (allTests) where++import Prelude ((.), id, ($), asTypeOf)++import Language.Hakaru.Syntax.Prelude+import Language.Hakaru.Types.DataKind+import Language.Hakaru.Syntax.AST (Term)+import Language.Hakaru.Syntax.ABT (ABT)++import Test.HUnit+import Tests.TestTools+import Tests.Models (normal_0_1, uniform_0_1)+++allTests :: Test+allTests = test+ [ testRelationships+ ]++testRelationships :: Test+testRelationships = test [+ "t1" ~: testSStriv [t1] (lam $ \_ -> lam $ \_ -> normal_0_1),+ "t2" ~: testSStriv [t2] (lam $ \b -> gamma b (prob_ 2)),+ "t3" ~: testSStriv [t3, t3'] (lam $ \a -> lam $ \x -> gamma a (prob_ 2)),+ "t4" ~: testSStriv [t4] (lam $ \a -> lam $ \b -> lam $ \_ -> beta a b),+ -- "t5" ~: testSStriv [t5, t5'] (lam $ \alpha -> gamma one (unsafeProb alpha)),+ --"t6" ~: testSS [t5] (lam $ \mu -> poisson mu >>= \x -> dirac (fromInt x)),+ "t7" ~: testSStriv [t7]+ (normal_0_1 >>= \x1 ->+ normal_0_1 >>= \x2 ->+ dirac (x1 * recip x2)),++ "t8" ~: testSStriv [t8]+ (lam $ \a ->+ lam $ \alpha ->+ (normal_0_1 >>= \x1 ->+ normal_0_1 >>= \x2 ->+ dirac (a + fromProb alpha * (x1 / x2)))),++ "t9" ~: testSStriv [t9]+ (lam $ \p -> bern p >>= \x -> dirac (if_ x one zero)),+ --Doesn't (if_ x one zero) simplify to just x?--Carl 2016Jul16+ ++ "t10" ~: testSStriv [t10] (unsafeProb <$> uniform_0_1),++ "t11" ~: testSStriv [t11]+ (lam $ \a1 ->+ lam $ \a2 ->+ gamma one (unsafeProb a1) >>= \x1 ->+ gamma one a2 >>= \x2 ->+ dirac ((fromProb x1) - (fromProb x2))),++ -- sum of n exponential(b) random variables is a gamma(n, b) random variable+ "t12" ~: testSStriv [t12] (lam $ \b -> gamma (prob_ 2) b),++ -- Weibull(b, 1) random variable is an exponential random variable with mean b+ --Above comment is wrong. Should be:+ --X ~ Weibull(a,1) => X ~ Exponential(1/a) + --"t13" ~: testSS [t13] (lam $ \b -> exponential (recip b)),+ --Above line is wrong. Should be:+ "t13" ~: testSStriv [t13] (lam $ \a -> exponential(recip a)),+ --Carl 2016Jul14++ -- If X is a standard normal random variable and U is a chi-squared random variable with v degrees of freedom,+ -- then X/sqrt(U/v) is a Student's t(v) random variable+ "t14" ~: testSStriv [t14] (lam $ \v -> studentT zero one v),++ "t15" ~: testSStriv [t15] (lam $ \k -> lam $ \t -> gamma k t),++ -- Linear combination property+ "t16" ~: testSStriv [t16] (normal zero (sqrt (prob_ 2))),+ "t17" ~: testSStriv [t17]+ (lam $ \mu ->+ lam $ \sigma ->+ normal mu (sqrt (one + sigma * sigma))),+ "t18" ~: testSStriv [t18]+ (lam $ \a1 ->+ lam $ \a2 ->+ normal zero (sqrt (a1 * a1 + a2 * a2))),++ -- Convolution property+ "t19" ~: testSStriv [t19]+ (lam $ \n1 ->+ lam $ \n2 ->+ lam $ \p ->+ binomial (n1 + n2) p),+ "t20" ~: testSStriv [t20]+ (lam $ \n ->+ lam $ \p ->+ binomial n p),+ "t21" ~: testSStriv [t21]+ (lam $ \l1 ->+ lam $ \l2 ->+ poisson (l1 + l2)),+ "t22" ~: testSStriv [t22]+ (lam $ \a1 ->+ lam $ \a2 ->+ lam $ \b ->+ gamma (a1 + a2) b),+ "t23" ~: testSStriv [t23] (lam $ \n -> lam $ \t -> gamma n t),++--I can't find any evidence for the truth of relationship t24. Indeed,+--it's trivial to prove false.--Carl 2016Jul16+-- -- Scaling property+-- "t24" ~: testSS [t24]+-- (lam $ \a ->+-- lam $ \b ->+-- lam $ \k ->+-- weibull (a * (k ** fromProb b)) b),++--The next test is wrong. The log x should be exp x (or whatever the+--exponential function is in Haskell).+ -- Product property+ "t25" ~: testSStriv [t25]+ (lam $ \mu1 ->+ lam $ \mu2 ->+ lam $ \sigma1 ->+ lam $ \sigma2 ->+ normal (mu1 + mu2) (sigma1 + sigma2) >>= \x ->+ dirac (log (unsafeProb x))),++ -- Inverse property+--I can't verify the relationship below. It's easy to prove false, except for+--the case l=0, where it's true. Where did it come from? It's too complex to+--have been entered by mistake.--Carl 2016Jul17 + "t26" ~: testSStriv [t26]+ (lam $ \l ->+ lam $ \s ->+ cauchy (l / (l*l + fromProb (s*s)))+ (s / (unsafeProb (l*l) + s*s))),++ -- Multiple of a random variable+ "t27" ~: testSStriv [t27]+ (lam $ \r ->+ lam $ \lambda ->+ lam $ \a ->+ gamma r (a * lambda))++ -- If X is a beta (a, b) random variable then (1 - X) is a beta (b, a) random variable.+ -- "t28" ~: testSStriv [t28] (lam $ \a -> lam $ \b -> beta b a)++ -- Cannot resolve type mismatch+ -- If X is a binomial (n, p) random variable then (n - X) is a binomial (n, 1-p) random variable.+ -- "t29" ~: testSStriv [t29] (lam $ \n -> lam $ \p -> binomial n (one - p))+ ]++t1 :: (ABT Term abt) => abt '[] ('HReal ':-> 'HProb ':-> 'HMeasure 'HReal)+t1 = lam (\mu -> (lam (\sigma ->+ normal mu sigma >>= \x ->+ dirac ((x - mu) / (fromProb sigma)))))++t2 :: (ABT Term abt) => abt '[] ('HProb ':-> 'HMeasure 'HProb)+t2 = lam $ \b -> chi2 ((prob_ 2) * b)++-- This test (and probably many others involving gamma) is wrong,+-- because the argument order to our gamma is the opposite of+-- the order used by 2008amstat.pdf+t3 :: (ABT Term abt) => abt '[] ('HProb ':-> 'HProb ':-> 'HMeasure 'HProb)+t3 =+ lam $ \alpha ->+ lam $ \bet ->+ gamma alpha bet >>= \x ->+ dirac ((prob_ 2) * x / bet)++t3' :: (ABT Term abt) => abt '[] ('HProb ':-> 'HProb ':-> 'HMeasure 'HProb)+t3' = lam $ \_ -> lam $ \bet -> chi2 ((prob_ 2) * bet)++t4 :: (ABT Term abt)+ => abt '[] ('HProb ':-> 'HProb ':-> 'HProb ':-> 'HMeasure 'HProb)+t4 =+ lam $ \a ->+ lam $ \b ->+ lam $ \t -> + gamma a t >>= \x1 ->+ gamma b t >>= \x2 ->+ dirac (x1 / (x1+x2))++-- t5 :: (ABT Term abt) => abt '[] ('HReal ':-> 'HMeasure 'HProb)+-- t5 =+ -- lam $ \alpha ->+ -- uniform_0_1 >>= \x ->+ -- dirac (unsafeProb (-1 * alpha) * unsafeProb (log (unsafeProb x)))++-- t5' :: (ABT Term abt) => abt '[] ('HReal ':-> 'HMeasure 'HProb)+-- t5' =+ -- lam $ \alpha ->+ -- laplace alpha (unsafeProb alpha) >>= \x ->+ -- dirac (abs (unsafeProb x))++-- Untestable right now with mu -> infinity, maybe later?+--t6 :: (ABT Term abt) => abt '[] ('HProb ':-> 'HMeasure 'HReal)+--t6 = lam (\mu -> normal infinity mu)++t7 :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)+t7 = cauchy zero one++t8 :: (ABT Term abt) => abt '[] ('HReal ':-> 'HProb ':-> 'HMeasure 'HReal)+t8 = lam $ \a -> lam $ \alpha -> cauchy a alpha++t9 :: (ABT Term abt) => abt '[] ('HProb ':-> 'HMeasure 'HInt)+t9 = lam $ \p -> binomial one p++t10 :: (ABT Term abt) => abt '[] ('HMeasure 'HProb)+t10 = beta one one++t11 :: (ABT Term abt) => abt '[] ('HReal ':-> 'HProb ':-> 'HMeasure 'HReal)+t11 = lam $ \a1 -> lam $ \a2 -> laplace a1 a2++t12 :: (ABT Term abt) => abt '[] ('HProb ':-> 'HMeasure 'HProb)+t12 =+ lam $ \b ->+ exponential b >>= \x1 ->+ exponential b >>= \x2 ->+ dirac (x1 + x2)++t13 :: (ABT Term abt) => abt '[] ('HProb ':-> 'HMeasure 'HProb)+--t13 = lam $ \b -> weibull one b+--Parameter order wrong in line above.--Carl 2016Jul14+t13 = lam $ \a -> weibull a one++t14 :: (ABT Term abt) => abt '[] ('HProb ':-> 'HMeasure 'HReal)+t14 =+ lam $ \v ->+ normal_0_1 >>= \x ->+ chi2 v >>= \u ->+ dirac (x / fromProb (sqrt (u / v)))++t15 :: (ABT Term abt) => abt '[] ('HProb ':-> 'HProb ':-> 'HMeasure 'HProb)+t15 =+ lam $ \k ->+ lam $ \t ->+ invgamma k (recip t) >>= \x ->+ dirac (recip x)++t16 :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)+t16 =+ normal_0_1 >>= \x1 ->+ normal_0_1 >>= \x2 ->+ dirac (x1 + x2)++t17 :: (ABT Term abt) => abt '[] ('HReal ':-> 'HProb ':-> 'HMeasure 'HReal)+t17 =+ lam $ \mu ->+ lam $ \sigma ->+ normal_0_1 >>= \x1 ->+ normal mu sigma >>= \x2 ->+ dirac (x1 + x2)++--I corrected the below. The relationship is about two rvs, not one. +t18 :: (ABT Term abt) => abt '[] ('HProb ':-> 'HProb ':-> 'HMeasure 'HReal)+t18 =+ lam $ \a1 ->+ lam $ \a2 ->+ normal_0_1 >>= \x ->+ normal_0_1 >>= \y ->+ --dirac (fromProb a1 * x + fromProb a2 * x)+ dirac (fromProb a1 * x + fromProb a2 * y)+--Actually, this relation is also true if a1 < 0 and/or a2 < 0. ++t19 :: (ABT Term abt)+ => abt '[] ('HNat ':-> 'HNat ':-> 'HProb ':-> 'HMeasure 'HInt)+t19 =+ lam $ \n1 ->+ lam $ \n2 ->+ lam $ \p ->+ binomial n1 p >>= \x1 ->+ binomial n2 p >>= \x2 ->+ dirac (x1 + x2)++--The next test is completely wrong. It's supposed to express something about+--the sum of n iid Bernoulli rvs. That's not the same thing as n times a single+--rv. Also, if_ x one zero simplifies to simply x.+t20 :: (ABT Term abt) => abt '[] ('HNat ':-> 'HProb ':-> 'HMeasure 'HInt)+t20 =+ lam $ \n ->+ lam $ \p ->+ bern p >>= \x ->+ dirac (nat2int (n * if_ x one zero))++t21 :: (ABT Term abt) => abt '[] ('HProb ':-> 'HProb ':-> 'HMeasure 'HNat)+t21 =+ lam $ \l1 ->+ lam $ \l2 ->+ poisson l1 >>= \x1 ->+ poisson l2 >>= \x2 ->+ dirac (x1 + x2)++t22 :: (ABT Term abt)+ => abt '[] ('HProb ':-> 'HProb ':-> 'HProb ':-> 'HMeasure 'HProb)+t22 =+ lam $ \a1 ->+ lam $ \a2 ->+ lam $ \b ->+ gamma a1 b >>= \x1 ->+ gamma a2 b >>= \x2 ->+ dirac (x1 + x2)++--The next test is completely wrong. It's supposed to express something about+--the sum of n iid Exponential rvs. That's not the same thing as n times a single+--rv. +t23 :: (ABT Term abt) => abt '[] ('HProb ':-> 'HProb ':-> 'HMeasure 'HProb)+t23 =+ lam $ \n ->+ lam $ \t ->+ exponential t >>= \x ->+ dirac (n * x)++--I can find no evidence for the truth of relationship t24. Indeed, it's+--trivial to prove false,+--t24 :: (ABT Term abt)+-- => abt '[] ('HProb ':-> 'HProb ':-> 'HProb ':-> 'HMeasure 'HProb)+--t24 =+-- lam $ \a ->+-- lam $ \b ->+-- lam $ \k ->+-- weibull a b >>= \x ->+-- dirac (k * x)++--The next test is wrong. The logs should be exps.+t25 :: (ABT Term abt) => abt '[]+ ('HReal ':-> 'HReal ':-> 'HProb ':-> 'HProb ':-> 'HMeasure 'HReal)+t25 =+ lam $ \mu1 ->+ lam $ \mu2 ->+ lam $ \sigma1 ->+ lam $ \sigma2 ->+ normal mu1 sigma1 >>= \x1 ->+ normal mu2 sigma2 >>= \x2 ->+ dirac (log (unsafeProb x1) * log (unsafeProb x2))++t26 :: (ABT Term abt) => abt '[] ('HReal ':-> 'HProb ':-> 'HMeasure 'HReal)+t26 =+ lam $ \l ->+ lam $ \s ->+ cauchy l s >>= \x ->+ dirac (recip x)++t27 :: (ABT Term abt)+ => abt '[] ('HProb ':-> 'HProb ':-> 'HProb ':-> 'HMeasure 'HProb)+t27 =+ lam $ \r ->+ lam $ \lambda ->+ lam $ \a ->+ gamma r lambda >>= \x ->+ dirac (a * x)++-- t28 :: (ABT Term abt) => abt '[] ('HProb ':-> 'HProb ':-> 'HMeasure 'HProb)+-- t28 =+ -- lam $ \a ->+ -- lam $ \b ->+ -- beta a b >>= \x ->+ -- dirac ((prob_ 1) - x)++-- Cannot resolve type mismatch+-- t29 :: (ABT Term abt) => abt '[] ('HNat ':-> 'HProb ':-> 'HMeasure 'HInt)+-- t29 =+ -- lam $ \n ->+ -- lam $ \p ->+ -- binomial n p >>= \x ->+ -- dirac (n - x)
haskell/Tests/RoundTrip.hs view
@@ -37,968 +37,248 @@ import Data.List (intercalate) import qualified Data.Text as Text -import Test.HUnit hiding ((~:), test)-import qualified Test.HUnit as HUnit-import Tests.TestTools hiding (testStriv, testSStriv, testConcreteFiles)-import qualified Tests.TestTools as Tools-import Tests.Models- (uniform_0_1, normal_0_1, gamma_1_1,- uniformC, normalC, beta_1_1, t4, t4', norm, unif2)--unsafeSuperpose- :: (ABT Term abt)- => [(abt '[] 'HProb, abt '[] ('HMeasure a))]- -> abt '[] ('HMeasure a)-unsafeSuperpose = superpose . L.fromList---class IsTestGroup t where - test :: [t] -> t --class IsTest' ta t | ta -> t, t -> ta where- (~:) :: String -> ta -> t --class IsTestAssertion ta where - testStriv - :: TrivialABT Term '[] a- -> ta -- testSStriv - :: [(TrivialABT Term '[] a)] - -> TrivialABT Term '[] a - -> ta -- testConcreteFiles- :: FilePath- -> FilePath- -> ta -- -instance IsTestGroup Test where test = HUnit.test; -instance IsTest' Assertion Test where (~:) = (HUnit.~:)-instance IsTestAssertion Assertion where - testStriv = Tools.testStriv; testSStriv = Tools.testSStriv; testConcreteFiles = Tools.testConcreteFiles---data SaveInput = forall a . TestInput [TrivialABT Term '[] a] (TrivialABT Term '[] a) | DoNothing-newtype SaveTests = SaveTests { runSaveTests :: IO () }--instance IsTestAssertion SaveInput where - testStriv = TestInput [] - testSStriv = TestInput - testConcreteFiles _ _ = DoNothing--instance IsTestGroup SaveTests where - test = SaveTests . mapM_ runSaveTests--instance IsTest' SaveInput SaveTests where - (~:) _ DoNothing = SaveTests (return ()) - (~:) tnm (TestInput xs r) = - let go (s,x) = do - createDirectoryIfMissing True $ intercalate "/" dn - (IO.writeFile fn . Text.pack . show . pretty . expandTransformations) x- where - dn = ["tests", "RoundTrip"]- fn = intercalate "/" $ dn ++ [concat [tnm, if null s then "" else ".", s, ".hk"]]- - xs' = case xs of- [] -> [("",r)]- _ -> ("expected",r) : Prelude.zip (Prelude.map Prelude.show [0..]) xs - in SaveTests $ mapM_ go xs' --type IsTest ta t = (IsTest' ta t, IsTestGroup t, IsTestAssertion ta)- --testMeasureUnit :: IsTest ta t => t-testMeasureUnit = test [- "t1,t5" ~: testSStriv [t1,t5] (weight half),- "t10" ~: testSStriv [t10] (reject sing),- "t11,t22" ~: testSStriv [t11,t22] (dirac unit),- "t12" ~: testSStriv [] t12,- "t20" ~: testSStriv [t20] (lam $ \y -> weight (y * half)),- "t24" ~: testSStriv [t24] t24',- "t25" ~: testSStriv [t25] t25',- "t44Add" ~: testSStriv [t44Add] t44Add',- "t44Mul" ~: testSStriv [t44Mul] t44Mul',- "t53" ~: testSStriv [t53,t53'] t53'',- "t54" ~: testStriv t54,- "t55" ~: testSStriv [t55] t55',- "t56" ~: testSStriv [t56,t56'] t56'',- "t57" ~: testSStriv [t57] t57',- "t58" ~: testSStriv [t58] t58',- "t59" ~: testStriv t59,- "t60" ~: testSStriv [t60,t60'] t60'',- "t62" ~: testSStriv [t62] t62',- "t63" ~: testSStriv [t63] t63',- "t64" ~: testSStriv [t64,t64'] t64'',- "t65" ~: testSStriv [t65] t65',- "t77" ~: testSStriv [] t77- ]--testMeasureProb :: IsTest ta t => t-testMeasureProb = test [- "t2" ~: testSStriv [t2] (unsafeProb <$> uniform zero one),- "t26" ~: testSStriv [t26] (dirac half),- "t30" ~: testSStriv [] t30,- "t33" ~: testSStriv [] t33,- "t34" ~: testSStriv [t34] (dirac (prob_ 3)),- "t35" ~: testSStriv [] t35,- "t35'" ~: testSStriv [] t35',- "t38" ~: testSStriv [] t38,- "t42" ~: testSStriv [t42] (dirac one),- "t49" ~: testSStriv [] t49,- "t61" ~: testSStriv [t61] t61',- "t66" ~: testSStriv [] t66,- "t67" ~: testSStriv [] t67,- "t69x" ~: testSStriv [t69x] (dirac $ prob_ 1.5),- "t69y" ~: testSStriv [t69y] (dirac $ prob_ 3.5)- ]--testMeasureReal :: IsTest ta t => t-testMeasureReal = test- [ "t3" ~: testSStriv [] t3- , "t6" ~: testSStriv [t6'] t6- , "t7" ~: testSStriv [t7] t7'- , "t7n" ~: testSStriv [t7n] t7n'- , "t8'" ~: testSStriv [t8'] (lam $ \s1 ->- lam $ \s2 ->- normal zero (sqrt $ (s2 ^ (nat_ 2) + s1 ^ (nat_ 2))))- , "t9" ~: testSStriv [t9] (unsafeSuperpose [(prob_ 2, uniform (real_ 3) (real_ 7))])- , "t13" ~: testSStriv [t13] t13'- , "t14" ~: testSStriv [t14] t14'- , "t21" ~: testStriv t21- , "t28" ~: testSStriv [] t28- , "t31" ~: testSStriv [] t31- , "t36" ~: testSStriv [] t36- , "t37" ~: testSStriv [] t37- , "t39" ~: testSStriv [] t39- , "t40" ~: testSStriv [] t40- , "t43" ~: testSStriv [t43, t43'] t43''- , "t46" ~: testSStriv [] t46- , "t45" ~: testSStriv [t47] t45- , "t50" ~: testStriv t50- , "t51" ~: testStriv t51- , "t68" ~: testStriv t68- , "t68'" ~: testStriv t68'- , "t70a" ~: testSStriv [t70a] (uniform one (real_ 3))- , "t71a" ~: testSStriv [t71a] (uniform one (real_ 3))- , "t72a" ~: testSStriv [t72a] (withWeight half $ uniform one (real_ 2))- , "t73a" ~: testSStriv [t73a] (reject sing)- , "t74a" ~: testSStriv [t74a] (reject sing)- , "t70b" ~: testSStriv [t70b] (reject sing)- , "t71b" ~: testSStriv [t71b] (reject sing)- , "t72b" ~: testSStriv [t72b] (withWeight half $ uniform (real_ 2) (real_ 3))- , "t73b" ~: testSStriv [t73b] (uniform one (real_ 3))- , "t74b" ~: testSStriv [t74b] (uniform one (real_ 3))- , "t70c" ~: testSStriv [t70c] (uniform one (real_ 3))- , "t71c" ~: testSStriv [t71c] (uniform one (real_ 3))- , "t72c" ~: testSStriv [t72c] (withWeight half $ uniform one (real_ 2))- , "t73c" ~: testSStriv [t73c] (reject sing)- , "t74c" ~: testSStriv [t74c] (reject sing)- , "t70d" ~: testSStriv [t70d] (reject sing)- , "t71d" ~: testSStriv [t71d] (reject sing)- , "t72d" ~: testSStriv [t72d] (withWeight half $ uniform (real_ 2) (real_ 3))- , "t73d" ~: testSStriv [t73d] (uniform one (real_ 3))- , "t74d" ~: testSStriv [t74d] (uniform one (real_ 3))- , "t76" ~: testStriv t76- , "t78" ~: testSStriv [t78] t78'- , "t79" ~: testSStriv [t79] (dirac one)- , "t80" ~: testStriv t80- , "t81" ~: testSStriv [] t81- -- TODO, "kalman" ~: testStriv kalman- --, "seismic" ~: testSStriv [] seismic- , "lebesgue1" ~: testSStriv [] (lebesgue >>= \x -> if_ ((real_ 42) < x) (dirac x) (reject sing))- , "lebesgue2" ~: testSStriv [] (lebesgue >>= \x -> if_ (x < (real_ 42)) (dirac x) (reject sing))- , "lebesgue3" ~: testSStriv [lebesgue >>= \x -> if_ (x < (real_ 42) && (real_ 40) < x) (dirac x) (reject sing)]- (withWeight (prob_ $ 2) $ uniform (real_ 40) (real_ 42))- , "testexponential" ~: testStriv testexponential- , "testcauchy" ~: testStriv testCauchy- , "exceptionLebesgue" ~: testSStriv [lebesgue >>= \x -> dirac (if_ (x == (real_ 3)) one x)] lebesgue- , "exceptionUniform" ~: testSStriv [uniform (real_ 2) (real_ 4) >>= \x ->- dirac (if_ (x == (real_ 3)) one x)- ] (uniform (real_ 2) (real_ 4))- -- TODO "two_coins" ~: testStriv two_coins -- needs support for lists- ]--testMeasureNat :: IsTest ta t => t -testMeasureNat = test- [ "size" ~: testConcreteFiles "tests/RoundTrip/size.0.hk" "tests/RoundTrip/size.expected.hk"- ]--testMeasureInt :: IsTest ta t => t-testMeasureInt = test- [ "t75" ~: testStriv t75- , "t75_hakaru" ~: testConcreteFiles "tests/t75_in.hk" "tests/t75_out.hk"- , "t75'" ~: testStriv t75'- , "t83" ~: testSStriv [t83] t83'- -- Jacques wrote: "bug: [simp_pw_equal] implicitly assumes the ambient measure is Lebesgue"- , "exceptionCounting" ~: testSStriv [] (counting >>= \x ->- if_ (x == (int_ 3))- (dirac one)- (dirac x))- , "exceptionSuperpose" ~: testSStriv - [(unsafeSuperpose [ (third, dirac (int_ 2))- , (third, dirac (int_ 3))- , (third, dirac (int_ 4))- ] `asTypeOf` counting) >>= \x -> - dirac (if_ (x == (int_ 3)) one x)]- (unsafeSuperpose [ (third, dirac (int_ 2))- , (third, dirac one)- , (third, dirac (int_ 4))- ])- ]--testMeasurePair :: IsTest ta t => t -testMeasurePair = test [- "t4" ~: testSStriv [t4] t4',- "t8" ~: testSStriv [] t8,- "t23" ~: testSStriv [t23] t23',- "t48" ~: testStriv t48,- "t52" ~: testSStriv [] t52,- "dup" ~: testSStriv [dup normal_0_1] (liftM2 pair- (normal zero one)- (normal zero one)),- "norm" ~: testSStriv [] norm,- "norm_nox" ~: testSStriv [norm_nox] (normal zero (sqrt (prob_ 2))),- "norm_noy" ~: testSStriv [norm_noy] (normal zero one),- "flipped_norm" ~: testSStriv [swap <$> norm] flipped_norm,- "priorProp" ~: testSStriv [lam (priorAsProposal norm)]- (lam $ \x -> unpair x $ \x0 x1 ->- unsafeSuperpose [(half, normal zero- (sqrt (prob_ 2)) >>= \y ->- dirac (pair x0 y)),- (half, normal_0_1 >>= \y ->- dirac (pair y x1))]),- "mhPriorProp" ~: testSStriv [testMHPriorProp] testPriorProp',- "unif2" ~: testStriv unif2,- "easyHMM" ~: testStriv easyHMM,- "testMCMCPriorProp" ~: testStriv testMCMCPriorProp- ]--testOther :: IsTest ta t => t-testOther = test [- "t82" ~: testSStriv [t82] t82',- "testRoadmapProg1" ~: testStriv rmProg1,- "testKernel" ~: testSStriv [testKernel] testKernel2- --"testFalseDetection" ~: testStriv (lam seismicFalseDetection),- --"testTrueDetection" ~: testStriv (lam2 seismicTrueDetection)- --"testTrueDetectionL" ~: testStriv tdl,- --"testTrueDetectionR" ~: testStriv tdr- ]--allTests :: IsTest ta t => t -allTests = test- [ testMeasureUnit- , testMeasureProb- , testMeasureReal- , testMeasurePair- , testMeasureNat- , testMeasureInt- , testOther- ]--save_allTests :: IO () -save_allTests = runSaveTests allTests --------------------------------------------------------------------- In Maple, should 'evaluate' to "\c -> 1/2*c(Unit)"-t1 :: (ABT Term abt) => abt '[] ('HMeasure HUnit)-t1 = uniform_0_1 >>= \x -> weight (unsafeProb x)--t2 :: (ABT Term abt) => abt '[] ('HMeasure 'HProb)-t2 = beta_1_1--t3 :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)-t3 = normal zero (prob_ 10)---- t5 is "the same" as t1.-t5 :: (ABT Term abt) => abt '[] ('HMeasure HUnit)-t5 = weight half >> dirac unit--t6, t6' :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)-t6 = dirac (real_ 5)-t6' = unsafeSuperpose [(one, dirac (real_ 5))]--t7,t7', t7n,t7n' :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)-t7 = uniform_0_1 >>= \x -> weight (unsafeProb (x+one)) >> dirac (x*x)-t7' = uniform_0_1 >>= \x -> unsafeSuperpose [(unsafeProb (x+one), dirac (x^(nat_ 2)))]-t7n =- uniform (negate one) zero >>= \x ->- weight (unsafeProb (x+one)) >>- dirac (x*x)-t7n' =- uniform (real_ (-1)) zero >>= \x ->- unsafeSuperpose [(unsafeProb (x + one), dirac (x^(nat_ 2)))]---- For sampling efficiency (to keep importance weights at or close to 1),--- t8 below should read back to uses of "normal", not uses of "lebesgue"--- then "weight".-t8 :: (ABT Term abt) => abt '[] ('HMeasure (HPair 'HReal 'HReal))-t8 = normal zero (prob_ 10) >>= \x -> normal x (prob_ 20) >>= \y -> dirac (pair x y)---- Normal is conjugate to normal-t8' :: (ABT Term abt)- => abt '[] ('HProb ':-> 'HProb ':-> 'HMeasure 'HReal)-t8' =- lam $ \s1 ->- lam $ \s2 ->- normal zero s1 >>= \x ->- normal x s2--t9 :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)-t9 =- lebesgue >>= \x -> - weight (if_ ((real_ 3) < x && x < (real_ 7)) half zero) >> - dirac x--t10 :: (ABT Term abt) => abt '[] ('HMeasure HUnit)-t10 = weight zero--t11 :: (ABT Term abt) => abt '[] ('HMeasure HUnit)-t11 = weight one--t12 :: (ABT Term abt) => abt '[] ('HMeasure HUnit)-t12 = weight (prob_ 2)--t13,t13' :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)-t13 = bern ((prob_ 3)/(prob_ 5)) >>= \b -> dirac (if_ b (real_ 37) (real_ 42))-t13' = unsafeSuperpose- [ (prob_ $ 3 % 5, dirac (real_ 37))- , (prob_ $ 2 % 5, dirac (real_ 42))- ]--t14,t14' :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)-t14 =- bern ((prob_ 3)/(prob_ 5)) >>= \b ->- if_ b t13 (bern ((prob_ 2)/(prob_ 7)) >>= \b' ->- if_ b' (uniform (real_ 10) (real_ 12)) (uniform (real_ 14) (real_ 16)))-t14' = unsafeSuperpose - [ (prob_ $ 9 % 25, dirac (real_ 37))- , (prob_ $ 6 % 25, dirac (real_ 42))- , (prob_ $ 4 % 35, uniform (real_ 10) (real_ 12))- , (prob_ $ 2 % 7 , uniform (real_ 14) (real_ 16))- ]--t20 :: (ABT Term abt) => abt '[] ('HProb ':-> 'HMeasure HUnit)-t20 = lam $ \y -> uniform_0_1 >>= \x -> weight (unsafeProb x * y)--t21 :: (ABT Term abt) => abt '[] ('HReal ':-> 'HMeasure 'HReal)-t21 = mcmc (lam $ \x -> normal x one) (normal zero (prob_ 5))--t22 :: (ABT Term abt) => abt '[] ('HMeasure HUnit)-t22 = bern half >> dirac unit---- was called bayesNet in Nov.06 msg by Ken for exact inference-t23, t23' :: (ABT Term abt) => abt '[] ('HMeasure (HPair HBool HBool))-t23 =- bern half >>= \a ->- bern (if_ a ((prob_ 9)/(prob_ 10)) ((prob_ 1)/(prob_ 10))) >>= \b ->- bern (if_ a ((prob_ 9)/(prob_ 10)) ((prob_ 1)/(prob_ 10))) >>= \c ->- dirac (pair b c)-t23' = unsafeSuperpose- [ ((prob_ $ 41 % 100), dirac (pair true true))- , ((prob_ $ 9 % 100), dirac (pair true false))- , ((prob_ $ 9 % 100), dirac (pair false true))- , ((prob_ $ 41 % 100), dirac (pair false false))- ]--t24,t24' :: (ABT Term abt) => abt '[] ('HProb ':-> 'HMeasure HUnit)-t24 =- lam $ \x ->- uniform_0_1 >>= \y ->- uniform_0_1 >>= \z ->- weight (x * exp (cos y) * unsafeProb z)-t24' =- lam $ \x ->- withWeight (x * half) $- uniform_0_1 >>= \y ->- weight (exp (cos y))--t25,t25' :: (ABT Term abt)- => abt '[] ('HProb ':-> 'HReal ':-> 'HMeasure HUnit)-t25 =- lam $ \x ->- lam $ \y ->- uniform_0_1 >>= \z ->- weight (x * exp (cos y) * unsafeProb z)-t25' =- lam $ \x ->- lam $ \y ->- weight (x * exp (cos y) * half)--t26 :: (ABT Term abt) => abt '[] ('HMeasure 'HProb)-t26 = dirac (total t1)--t28 :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)-t28 = uniform zero one--t30 :: (ABT Term abt) => abt '[] ('HMeasure 'HProb)-t30 = exp <$> uniform zero one--t31 :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)-t31 = uniform (real_ (-1)) one--t33 :: (ABT Term abt) => abt '[] ('HMeasure 'HProb)-t33 = exp <$> t31--t34 :: (ABT Term abt) => abt '[] ('HMeasure 'HProb)-t34 = dirac (if_ ((real_ 2) < (real_ 4)) (prob_ 3) (prob_ 5))--t35, t35' :: (ABT Term abt) => abt '[] ('HReal ':-> 'HMeasure 'HProb)-t35 = lam $ \x -> dirac (if_ ((x `asTypeOf` log one) < (real_ 4)) (prob_ 3) (prob_ 5))-t35' = lam $ \x -> if_ (x < (fromRational 4)) (dirac (fromRational 3)) (dirac (fromRational 5))--t36 :: (ABT Term abt) => abt '[] ('HProb ':-> 'HMeasure 'HProb)-t36 = lam (dirac . sqrt)--t37 :: (ABT Term abt) => abt '[] ('HReal ':-> 'HMeasure 'HReal)-t37 = lam (dirac . recip)--t38 :: (ABT Term abt) => abt '[] ('HProb ':-> 'HMeasure 'HProb)-t38 = lam (dirac . recip)--t39 :: (ABT Term abt) => abt '[] ('HProb ':-> 'HMeasure 'HReal)-t39 = lam (dirac . log)--t40 :: (ABT Term abt) => abt '[] ('HProb ':-> 'HMeasure 'HReal)-t40 = lam (dirac . log)--t42 :: (ABT Term abt) => abt '[] ('HMeasure 'HProb)-t42 = dirac . total $ (unsafeProb <$> uniform zero (real_ 2))--t43, t43', t43'' :: (ABT Term abt) => abt '[] (HBool ':-> 'HMeasure 'HReal)-t43 = lam $ \b -> if_ b uniform_0_1 (fromProb <$> beta_1_1)-t43' = lam $ \b -> if_ b uniform_0_1 uniform_0_1-t43'' = lam $ \_ -> uniform_0_1--t44Add, t44Add', t44Mul, t44Mul'- :: (ABT Term abt) => abt '[] ('HReal ':-> 'HReal ':-> 'HMeasure HUnit)-t44Add = lam $ \x -> lam $ \y -> weight (unsafeProb $ (x * x) + (y * y))-t44Add' = lam $ \x -> lam $ \y -> weight (unsafeProb $ (x ^ (nat_ 2) + y ^ (nat_ 2)))-t44Mul = lam $ \x -> lam $ \y -> weight (unsafeProb $ (x * x * y * y))-t44Mul' = lam $ \x -> lam $ \y -> weight (unsafeProb $ (x ^ (nat_ 2)) * (y ^ (nat_ 2)))---- t45, t46, t47 are all equivalent.--- But t47 is worse than t45 and t46 because the importance weight generated by--- t47 as a sampler varies between 0 and 1 whereas the importance weight generated--- by t45 and t46 is always 1. In general it's good to reduce weight variance.-t45 :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)-t45 = normal (real_ 4) (prob_ 5) >>= \x -> if_ (x < (real_ 3)) (dirac (x^(nat_ 2))) (dirac (x+(real_ (-1))))--t46 :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)-t46 = normal (real_ 4) (prob_ 5) >>= \x -> dirac (if_ (x < (real_ 3)) (x*x) (x-one))--t47 :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)-t47 = unsafeSuperpose- [ (one, normal (real_ 4) (prob_ 5) >>= \x -> if_ (x < (real_ 3)) (dirac (x*x)) (reject sing))- , (one, normal (real_ 4) (prob_ 5) >>= \x -> if_ (x < (real_ 3)) (reject sing) (dirac (x-one)))- ]--t48 :: (ABT Term abt) => abt '[] (HPair 'HReal 'HReal ':-> 'HMeasure 'HReal)-t48 = lam $ \x -> uniform (real_ (-5)) (real_ 7) >>= \w -> dirac ((fst x + snd x) * w)--t49 :: (ABT Term abt) => abt '[] ('HMeasure 'HProb)-t49 = gamma (prob_ 0.01) (prob_ 0.35)--t50 :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)-t50 = uniform one (real_ 3) >>= \x -> normal one (unsafeProb x)--t51 :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)-t51 = t31 >>= \x -> normal x one---- Example 1 from Chang & Pollard's Conditioning as Disintegration-t52 :: (ABT Term abt) => abt '[] ('HMeasure (HPair 'HReal (HPair 'HReal 'HReal)))-t52 =- uniform_0_1 >>= \x ->- uniform_0_1 >>= \y ->- dirac (pair (max y x) (pair x y))--t53, t53', t53'' :: (ABT Term abt) => abt '[] ('HReal ':-> 'HMeasure HUnit)-t53 =- lam $ \x ->- unsafeSuperpose- [ (one, unsafeSuperpose- [ (one,- if_ (zero < x)- (if_ (x < one) (dirac unit) (reject sing))- (reject sing))- ])- , (one, if_ false (dirac unit) (reject sing))- ]-t53' =- lam $ \x ->- unsafeSuperpose- [ (one,- if_ (zero < x)- (if_ (x < one) (dirac unit) (reject sing))- (reject sing))- , (one, if_ false (dirac unit) (reject sing))- ]-t53'' =- lam $ \x ->- if_ (zero < x && x < one) (dirac unit) (reject sing)--t54 :: (ABT Term abt) => abt '[] ('HReal ':-> 'HMeasure HUnit)-t54 =- lam $ \x0 ->- ( dirac x0 >>= \x1 ->- (negate <$> uniform_0_1) >>= \x2 ->- dirac (x1 + x2)- ) >>= \x1 ->- ( ( (dirac zero >>= \x2 ->- dirac x1 >>= \x3 ->- dirac (x2 < x3)- ) >>= \x2 ->- if_ x2- (recip <$> dirac x1)- (dirac zero)- ) >>= \x2 ->- weight (unsafeProb x2)- ) >>- (log <$> dirac (unsafeProb x1)) >>= \x3 ->- (negate <$> dirac x3) >>= \x4 ->- (- (dirac zero >>= \x5 ->- dirac x4 >>= \x6 ->- dirac (x5 < x6)- ) >>= \x5 ->- if_ x5- ( (dirac x4 >>= \x6 ->- dirac one >>= \x7 ->- dirac (x6 < x7)- ) >>= \x6 ->- if_ x6 (dirac one) (dirac zero)- )- (dirac zero)- ) >>= \x5 ->- weight (unsafeProb x5)--t55, t55' :: (ABT Term abt) => abt '[] ('HReal ':-> 'HMeasure HUnit)-t55 =- lam $ \t ->- uniform_0_1 >>= \x ->- if_ (x < t) (dirac unit) (reject sing)-t55' =- lam $ \t ->- if_ (t < zero) (reject sing) $- if_ (t < one) (weight (unsafeProb t)) $- dirac unit--t56, t56', t56'' :: (ABT Term abt) => abt '[] ('HReal ':-> 'HMeasure HUnit)-t56 =- lam $ \x0 ->- ( dirac x0 >>= \x1 ->- (negate <$> uniform_0_1) >>= \x2 ->- dirac (x1 + x2)- ) >>= \x1 ->- ( (dirac zero >>= \x2 ->- dirac x1 >>= \x3 ->- dirac (x2 < x3)- ) >>= \x2 ->- if_ x2- ( (dirac x1 >>= \x3 ->- dirac one >>= \x4 ->- dirac (x3 < x4)- ) >>= \x3 ->- if_ x3 (dirac one) (dirac zero))- (dirac zero)- ) >>= \x2 ->- withWeight (unsafeProb x2) (dirac unit)-t56' =- lam $ \x0 ->- uniform_0_1 >>= \x1 ->- if_ (x0 - one < x1 && x1 < x0)- (dirac unit)- (reject sing)-t56'' =- lam $ \t ->- if_ (t <= zero) (reject sing) $- if_ (t <= one) (weight (unsafeProb t)) $- if_ (t <= (real_ 2)) (weight (unsafeProb ((real_ 2) + t * negate one))) $- reject sing--t57, t57' :: (ABT Term abt) => abt '[] ('HReal ':-> 'HMeasure HUnit)-t57 = lam $ \t -> unsafeSuperpose- [ (one, if_ (t < one) (dirac unit) (reject sing))- , (one, if_ (zero < t) (dirac unit) (reject sing)) ]-t57' = lam $ \t -> - if_ (t < one && zero < t) (weight (prob_ 2)) (dirac unit)--t58, t58' :: (ABT Term abt) => abt '[] ('HReal ':-> 'HMeasure HUnit)-t58 = lam $ \t -> unsafeSuperpose- [ (one, if_ (zero < t && t < (real_ 2)) (dirac unit) (reject sing))- , (one, if_ (one < t && t < (real_ 3)) (dirac unit) (reject sing)) ]-t58' = lam $ \t ->- if_ (if_ (zero < t) (t < (real_ 2)) false)- (if_ (if_ (one < t) (t < (real_ 3)) false)- (weight (prob_ 2))- (dirac unit))- (if_ (if_ (one < t) (t < (real_ 3)) false)- (dirac unit)- (reject sing))--t59 :: (ABT Term abt) => abt '[] ('HReal ':-> 'HMeasure HUnit)-t59 =- lam $ \x0 ->- ((recip <$> uniform_0_1) >>= \x1 ->- (((dirac zero >>= \x2 ->- dirac x1 >>= \x3 ->- dirac (x2 < x3)) >>= \x2 ->- if_ x2- (dirac x1)- (negate <$> dirac x1)) >>= \x2 ->- weight (unsafeProb x2) ) >>- dirac x0 >>= \x3 ->- dirac x1 >>= \x4 ->- dirac (x3 * x4)) >>= \x1 ->- (dirac x1 >>= \x2 ->- (negate <$> uniform_0_1) >>= \x3 ->- dirac (x2 + x3)) >>= \x2 ->- ((dirac zero >>= \x3 ->- dirac x2 >>= \x4 ->- dirac (x3 < x4)) >>= \x3 ->- if_ x3- ((dirac x2 >>= \x4 ->- dirac one >>= \x5 ->- dirac (x4 < x5)) >>= \x4 ->- if_ x4 (dirac one) (dirac zero))- (dirac zero)) >>= \x3 ->- weight (unsafeProb x3) --t60,t60',t60'' :: (ABT Term abt) => abt '[] ('HReal ':-> 'HMeasure HUnit)-t60 =- lam $ \x0 ->- (((uniform_0_1 >>= \x1 ->- uniform_0_1 >>= \x2 ->- dirac (x1 + x2)) >>= \x1 ->- dirac (recip x1)) >>= \x1 ->- (((dirac zero >>= \x2 ->- dirac x1 >>= \x3 ->- dirac (x2 < x3)) >>= \x2 ->- if_ x2- (dirac x1)- (negate <$> dirac x1)) >>= \x2 ->- weight (unsafeProb x2) ) >>- dirac x0 >>= \x3 ->- dirac x1 >>= \x4 ->- dirac (x3 * x4)) >>= \x1 ->- ((dirac zero >>= \x2 ->- dirac x1 >>= \x3 ->- dirac (x2 < x3)) >>= \x2 ->- if_ x2- ((dirac x1 >>= \x3 ->- dirac one >>= \x4 ->- dirac (x3 < x4)) >>= \x3 ->- if_ x3 (dirac one) (dirac zero))- (dirac zero)) >>= \x2 ->- weight (unsafeProb x2)-t60' =- lam $ \x0 ->- uniform_0_1 >>= \x1 ->- uniform_0_1 >>= \x2 ->- if_ (if_ (zero < x0 / (x2 + x1))- (x0 / (x2 + x1) < one)- false)- (weight ((unsafeProb (x2 + x1)) ^^ negate one) )- (reject sing)-t60'' =- lam $ \x0 ->- uniform_0_1 >>= \x1 ->- uniform_0_1 >>= \x2 ->- if_ (if_ (zero < x0 / (x2 + x1))- (x0 / (x2 + x1) < one)- false)- (weight (recip (unsafeProb (x2 + x1))) )- (reject sing)--t61, t61' :: (ABT Term abt) => abt '[] ('HReal ':-> 'HMeasure 'HProb)-t61 = lam $ \x -> if_ (x < zero) (dirac zero) $ dirac $ unsafeProb $ recip x-t61'= lam $ \x -> if_ (x < zero) (dirac zero) $ dirac $ unsafeProb $ recip x------ "Special case" of t56-t62, t62' :: (ABT Term abt) => abt '[] ('HReal ':-> 'HReal ':-> 'HMeasure HUnit)-t62 = lam $ \t ->- lam $ \x ->- uniform_0_1 >>= \y ->- if_ (zero < t/x - y && t/x - y < one)- (dirac unit)- (reject sing)-t62'= lam $ \t ->- lam $ \x ->- if_ (t/x <= zero) (reject sing) $- if_ (t/x <= one) (weight (unsafeProb (t/x))) $- if_ (t/x <= (real_ 2)) (weight (unsafeProb ((real_ 2)-t/x))) $- reject sing------ "Scalar multiple" of t62-t63, t63' :: (ABT Term abt) => abt '[] ('HReal ':-> 'HMeasure HUnit)-t63 = lam $ \t ->- uniform_0_1 >>= \x ->- uniform_0_1 >>= \y ->- if_ (zero < t/x - y && t/x - y < one)- (weight (recip (unsafeProb x)))- (reject sing)-t63'= lam $ \t ->- uniform_0_1 >>= \x ->- if_ (t/x <= zero) (reject sing) $- if_ (t/x <= one) (weight (unsafeProb (t/x) / unsafeProb x)) $- if_ (t/x <= (real_ 2)) (weight (unsafeProb ((real_ 2)-t/x) / unsafeProb x)) $- reject sing---- Density calculation for (Exp (Log StdRandom)) and StdRandom-t64, t64', t64'' :: (ABT Term abt) => abt '[] ('HReal ':-> 'HMeasure HUnit)-t64 = lam $ \x0 ->- (((dirac zero >>= \x1 ->- dirac x0 >>= \x2 ->- dirac (x1 < x2)) >>= \x1 ->- if_ x1- (recip <$> dirac x0)- (dirac zero)) >>= \x1 ->- weight (unsafeProb x1)) >>- (log <$> dirac (unsafeProb x0)) >>= \x2 ->- ((exp <$> dirac x2) >>= \x3 ->- weight x3) >>- (exp <$> dirac x2) >>= \x4 ->- ((dirac zero >>= \x5 ->- dirac x4 >>= \x6 ->- dirac (x5 < x6)) >>= \x5 ->- if_ x5- ((dirac x4 >>= \x6 ->- dirac one >>= \x7 ->- dirac (x6 < x7)) >>= \x6 ->- if_ x6 (dirac one) (dirac zero))- (dirac zero)) >>= \x5 ->- weight (unsafeProb x5) -t64' =lam $ \x0 ->- ((dirac zero >>= \x1 ->- dirac x0 >>= \x2 ->- dirac (x1 < x2)) >>= \x1 ->- if_ x1- ((dirac x0 >>= \x2 ->- dirac one >>= \x3 ->- dirac (x2 < x3)) >>= \x2 ->- if_ x2 (dirac one) (dirac zero))- (dirac zero)) >>= \x1 ->- weight (unsafeProb x1) -t64''=lam $ \x0 ->- if_ (zero < x0 && x0 < one) - (dirac unit)- (reject sing)---- Density calculation for (Add StdRandom (Exp (Neg StdRandom))).--- Maple can integrate this but we don't simplify it for some reason.-t65, t65' :: (ABT Term abt) => abt '[] ('HReal ':-> 'HMeasure HUnit)-t65 =- lam $ \t ->- uniform_0_1 >>= \x ->- if_ (zero < t-x)- (let_ (unsafeProb (t-x)) $ \t_x ->- withWeight (recip t_x) $- (if_ (zero < negate (log t_x) && negate (log t_x) < one)- (dirac unit)- (reject sing)))- (reject sing)-t65' =- lam $ \t ->- uniform_0_1 >>= \x->- withWeight (if_ (real_ 0 < (log (unsafeProb (t + x * real_ (-1))) * real_ (-1)) &&- x < (t * fromProb (exp (real_ 1)) + real_ (-1)) * fromProb (exp (real_ (-1))) &&- x < t)- (unsafeProb (recip (x * real_ (-1) + t)))- (prob_ 0)) $ (dirac unit)--half' :: (ABT Term abt) => abt '[] 'HReal-half' = half--t66 :: (ABT Term abt) => abt '[] ('HMeasure 'HProb)-t66 = dirac (sqrt $ prob_ 3 + (sqrt $ prob_ 3))--t67 :: (ABT Term abt) => abt '[] ('HProb ':-> 'HReal ':-> 'HMeasure 'HProb)-t67 = lam $ \p -> lam $ \r -> dirac (exp (r * fromProb p))--t68 :: (ABT Term abt)- => abt '[] ('HProb ':-> 'HProb ':-> 'HReal ':-> 'HMeasure 'HReal)-t68 =- lam $ \x4 ->- lam $ \x5 ->- lam $ \x1 ->- lebesgue >>= \x2 ->- lebesgue >>= \x3 ->- withWeight (exp (negate (x2 - x3) * (x2 - x3)- * recip (fromProb ((fromRational 2) * exp (log x4 * (fromRational 2)))))- * recip x4- * recip (exp (log ((fromRational 2) * pi) * half)))- (withWeight (exp (negate (x1 - x3) * (x1 - x3)- * recip (fromProb ((fromRational 2) * exp (log x5 * (fromRational 2)))))- * recip x5- * recip (exp (log ((fromRational 2) * pi) * half)))- (withWeight (exp (negate x3 * x3- * recip (fromProb ((fromRational 2) * exp (log x4 * (fromRational 2)))))- * recip x4- * recip (exp (log ((fromRational 2) * pi) * half)))- (dirac x2)))--t68' :: (ABT Term abt) => abt '[] ('HProb ':-> 'HReal ':-> 'HMeasure 'HReal)-t68' = lam $ \noise -> app (app t68 noise) noise--t69x, t69y :: (ABT Term abt) => abt '[] ('HMeasure 'HProb)-t69x = dirac (integrate one (real_ 2) $ \x -> integrate (real_ 3) (real_ 4) $ \_ -> unsafeProb x)-t69y = dirac (integrate one (real_ 2) $ \_ -> integrate (real_ 3) (real_ 4) $ \y -> unsafeProb y)--t70a, t71a, t72a, t73a, t74a :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)-t70a = uniform one (real_ 3) >>= \x -> if_ ((real_ 4) < x) (reject sing) (dirac x)-t71a = uniform one (real_ 3) >>= \x -> if_ ((real_ 3) < x) (reject sing) (dirac x)-t72a = uniform one (real_ 3) >>= \x -> if_ ((real_ 2) < x) (reject sing) (dirac x)-t73a = uniform one (real_ 3) >>= \x -> if_ (one < x) (reject sing) (dirac x)-t74a = uniform one (real_ 3) >>= \x -> if_ (zero < x) (reject sing) (dirac x)--t70b, t71b, t72b, t73b, t74b :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)-t70b = uniform one (real_ 3) >>= \x -> if_ ((real_ 4) < x) (dirac x) (reject sing)-t71b = uniform one (real_ 3) >>= \x -> if_ ((real_ 3) < x) (dirac x) (reject sing)-t72b = uniform one (real_ 3) >>= \x -> if_ ((real_ 2) < x) (dirac x) (reject sing)-t73b = uniform one (real_ 3) >>= \x -> if_ (one < x) (dirac x) (reject sing)-t74b = uniform one (real_ 3) >>= \x -> if_ (zero < x) (dirac x) (reject sing)--t70c, t71c, t72c, t73c, t74c :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)-t70c = uniform one (real_ 3) >>= \x -> if_ (x < (real_ 4)) (dirac x) (reject sing)-t71c = uniform one (real_ 3) >>= \x -> if_ (x < (real_ 3)) (dirac x) (reject sing)-t72c = uniform one (real_ 3) >>= \x -> if_ (x < (real_ 2)) (dirac x) (reject sing)-t73c = uniform one (real_ 3) >>= \x -> if_ (x < one) (dirac x) (reject sing)-t74c = uniform one (real_ 3) >>= \x -> if_ (x < zero) (dirac x) (reject sing)--t70d, t71d, t72d, t73d, t74d :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)-t70d = uniform one (real_ 3) >>= \x -> if_ (x < (real_ 4)) (reject sing) (dirac x)-t71d = uniform one (real_ 3) >>= \x -> if_ (x < (real_ 3)) (reject sing) (dirac x)-t72d = uniform one (real_ 3) >>= \x -> if_ (x < (real_ 2)) (reject sing) (dirac x)-t73d = uniform one (real_ 3) >>= \x -> if_ (x < one) (reject sing) (dirac x)-t74d = uniform one (real_ 3) >>= \x -> if_ (x < zero) (reject sing) (dirac x)--t75 :: (ABT Term abt) => abt '[] ('HMeasure 'HNat)-t75 = gamma (prob_ 6) one >>= poisson--t75' :: (ABT Term abt) => abt '[] ('HProb ':-> 'HMeasure 'HNat)-t75' = lam $ \x -> gamma x one >>= poisson--t76 :: (ABT Term abt) => abt '[] ('HReal ':-> 'HMeasure 'HReal)-t76 =- lam $ \x ->- lebesgue >>= \y ->- withWeight (unsafeProb (abs y)) $- if_ (y < one)- (if_ (zero < y)- (if_ (x * y < one)- (if_ (zero < x * y)- (dirac (x * y))- (reject sing))- (reject sing))- (reject sing))- (reject sing)---- the (x * (-1)) below is an unfortunate artifact not worth fixing-t77 :: (ABT Term abt) => abt '[] ('HReal ':-> 'HMeasure HUnit)-t77 =- lam $ \x ->- if_ (x < zero)- (weight (recip (exp x)))- (weight (exp x))--t78, t78' :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)-t78 = uniform zero (real_ 2) >>= \x2 -> withWeight (unsafeProb x2) (dirac x2)-t78' = beta (prob_ 2) one >>= \x -> dirac ((fromProb x) * (real_ 2))---- what does this simplify to?-t79 :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)-t79 = dirac (real_ 3) >>= \x -> dirac (if_ (x == (real_ 3)) one x)--t80 :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)-t80 = gamma_1_1 >>= \t -> normal zero t--t81 :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)-t81 = uniform zero pi--t82 :: (ABT Term abt) => abt '[] ('HReal ':-> 'HProb)-t82 = lam (densityUniform zero one)--t82' :: (ABT Term abt) => abt '[] ('HReal ':-> 'HProb)-t82' = lam $ \x -> one --t83 :: (ABT Term abt) => abt '[] ('HNat ':-> 'HMeasure 'HNat)-t83 = lam $ \k ->- plate k (\_ -> dirac (nat_ 1)) >>= \x ->- dirac (size x)--t83' :: (ABT Term abt) => abt '[] ('HNat ':-> 'HMeasure 'HNat)-t83' = lam dirac---- Testing round-tripping of some other distributions-testexponential :: (ABT Term abt) => abt '[] ('HMeasure 'HProb)-testexponential = exponential third--testCauchy :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)-testCauchy = cauchy (real_ 5) (prob_ 3)--testMCMCPriorProp- :: (ABT Term abt)- => abt '[] (HPair 'HReal 'HReal ':-> 'HMeasure (HPair 'HReal 'HReal))-testMCMCPriorProp = mcmc (lam $ priorAsProposal norm) norm--testMHPriorProp- :: (ABT Term abt)- => abt '[]- (HPair 'HReal 'HReal- ':-> 'HMeasure (HPair (HPair 'HReal 'HReal) 'HProb))-testMHPriorProp = mh (lam $ priorAsProposal norm) norm--testPriorProp'- :: (ABT Term abt)- => abt '[]- (HPair 'HReal 'HReal- ':-> 'HMeasure (HPair (HPair 'HReal 'HReal) 'HProb))-testPriorProp' =- lam $ \old ->- unsafeSuperpose- [(half,- normal_0_1 >>= \x1 ->- dirac (pair (pair x1 (snd old))- (exp- ( (x1 * negate one + (old `unpair` \x2 x3 -> x2))- * ( (old `unpair` \x2 x3 -> x2)- + (old `unpair` \x2 x3 -> x3) * (negate (real_ 2))- + x1)- * half))))- , (half,- normal zero (sqrt (prob_ 2)) >>= \x1 ->- dirac (pair (pair (fst old) x1)- (exp- ( (x1 + (old `unpair` \x2 x3 -> x3) * negate one)- * ( (old `unpair` \x2 x3 -> x3)- + (old `unpair` \x2 x3 -> x2) * (negate (real_ 4))- + x1)- * (negate (real_ 1))/(real_ 4)))))- ]--dup :: (ABT Term abt, SingI a)- => abt '[] ('HMeasure a)- -> abt '[] ('HMeasure (HPair a a))-dup m = let_ m (\m' -> liftM2 pair m' m')--norm_nox :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)-norm_nox =- normal_0_1 >>= \x ->- normal x one >>= \y ->- dirac y--norm_noy :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)-norm_noy =- normal_0_1 >>= \x ->- normal x one >>- dirac x--flipped_norm :: (ABT Term abt) => abt '[] ('HMeasure (HPair 'HReal 'HReal))-flipped_norm =- normal zero one >>= \x ->- normal x one >>= \y ->- dirac (pair y x)+import Test.HUnit+import Tests.TestTools+import Tests.Models+ (uniform_0_1, normal_0_1, gamma_1_1,+ uniformC, normalC, beta_1_1, norm, unif2)+-- import Tests.Models (t4, t4')+unsafeSuperpose+ :: (ABT Term abt)+ => [(abt '[] 'HProb, abt '[] ('HMeasure a))]+ -> abt '[] ('HMeasure a)+unsafeSuperpose = superpose . L.fromList++testMeasureUnit :: Test+testMeasureUnit = test [+ "t1" ~: testConcreteFiles "tests/RoundTrip/t1,t5.0.hk" "tests/RoundTrip/t1,t5.expected.hk", -- In Maple, should 'evaluate' to "\c -> 1/2*c(Unit)"+ "t5" ~: testConcreteFiles "tests/RoundTrip/t1,t5.1.hk" "tests/RoundTrip/t1,t5.expected.hk", -- t5 is "the same" as t1.+ "t10" ~: testConcreteFiles "tests/RoundTrip/t10.0.hk" "tests/RoundTrip/t10.expected.hk",+ "t11" ~: testConcreteFiles "tests/RoundTrip/t11,t22.0.hk" "tests/RoundTrip/t11,t22.expected.hk", + "t12" ~: testConcreteFilesMany [] "tests/RoundTrip/t12.hk",+ "t20" ~: testConcreteFiles "tests/RoundTrip/t20.0.hk" "tests/RoundTrip/t20.expected.hk",+ "t22" ~: testConcreteFiles "tests/RoundTrip/t11,t22.1.hk" "tests/RoundTrip/t11,t22.expected.hk",+ "t24" ~: testConcreteFiles "tests/RoundTrip/t24.0.hk" "tests/RoundTrip/t24.expected.hk",+ "t25" ~: testConcreteFiles "tests/RoundTrip/t25.0.hk" "tests/RoundTrip/t25.expected.hk",+ "t44Add" ~: testConcreteFiles "tests/RoundTrip/t44Add.0.hk" "tests/RoundTrip/t44Add.expected.hk",+ "t44Mul" ~: testConcreteFiles "tests/RoundTrip/t44Mul.0.hk" "tests/RoundTrip/t44Mul.expected.hk",+ "t53" ~: testConcreteFiles "tests/RoundTrip/t53.0.hk" "tests/RoundTrip/t53.expected.hk",+ "t53'" ~: testConcreteFiles "tests/RoundTrip/t53.1.hk" "tests/RoundTrip/t53.expected.hk",+ "t54" ~: testConcreteFile "tests/RoundTrip/t54.hk",+ "t55" ~: testConcreteFiles "tests/RoundTrip/t55.0.hk" "tests/RoundTrip/t55.expected.hk",+ "t56" ~: testConcreteFiles "tests/RoundTrip/t56.0.hk" "tests/RoundTrip/t56.expected.hk",+ "t56'" ~: testConcreteFiles "tests/RoundTrip/t56.1.hk" "tests/RoundTrip/t56.expected.hk",+ "t57" ~: testConcreteFiles "tests/RoundTrip/t57.0.hk" "tests/RoundTrip/t57.expected.hk",+ "t58" ~: testConcreteFiles "tests/RoundTrip/t58.0.hk" "tests/RoundTrip/t58.expected.hk",+ "t59" ~: testConcreteFile "tests/RoundTrip/t59.hk",+ "t60" ~: testConcreteFilesMany [ "tests/RoundTrip/t60.0.hk"+ , "tests/RoundTrip/t60.1.hk" ]+ "tests/RoundTrip/t60.expected.hk",+ "t62" ~: testConcreteFiles "tests/RoundTrip/t62.0.hk" "tests/RoundTrip/t62.expected.hk", ---- "Special case" of t56+ "t63" ~: testConcreteFiles "tests/RoundTrip/t63.0.hk" "tests/RoundTrip/t63.expected.hk", ---- "Scalar multiple" of t62+ "t64" ~: testConcreteFiles "tests/RoundTrip/t64.0.hk" "tests/RoundTrip/t64.expected.hk", -- Density calculation for (Exp (Log StdRandom)) and StdRandom+ "t64'" ~: testConcreteFiles "tests/RoundTrip/t64.1.hk" "tests/RoundTrip/t64.expected.hk", -- Density calculation for (Exp (Log StdRandom)) and StdRandom+ "t65" ~: testConcreteFiles "tests/RoundTrip/t65.0.hk" "tests/RoundTrip/t65.expected.hk", -- Density calculation for (Add StdRandom (Exp (Neg StdRandom))); Maple can integrate this but we don't simplify it for some reason.+ "t77" ~: testConcreteFilesMany [] "tests/RoundTrip/t77.hk" -- the (x * (-1)) below is an unfortunate artifact not worth fixing+ ]++testMeasureProb :: Test+testMeasureProb = test [+ "t2" ~: testConcreteFiles "tests/RoundTrip/t2.0.hk" "tests/RoundTrip/t2.expected.hk",+ "t26" ~: testConcreteFiles "tests/RoundTrip/t26.0.hk" "tests/RoundTrip/t26.expected.hk",+ "t30" ~: testConcreteFilesMany [] "tests/RoundTrip/t30.hk",+ "t33" ~: testConcreteFilesMany [] "tests/RoundTrip/t33.hk",+ "t34" ~: testConcreteFiles "tests/RoundTrip/t34.0.hk" "tests/RoundTrip/t34.expected.hk",+ "t35" ~: testConcreteFilesMany [] "tests/RoundTrip/t35.0.hk",+ "t35'" ~: testConcreteFilesMany [] "tests/RoundTrip/t35.expected.hk",+ "t38" ~: testConcreteFilesMany [] "tests/RoundTrip/t38.hk",+ "t42" ~: testConcreteFiles "tests/RoundTrip/t42.0.hk" "tests/RoundTrip/t42.expected.hk",+ "t49" ~: testConcreteFilesMany [] "tests/RoundTrip/t49.hk",+ "t61" ~: testConcreteFiles "tests/RoundTrip/t61.0.hk" "tests/RoundTrip/t61.expected.hk",+ "t66" ~: testConcreteFilesMany [] "tests/RoundTrip/t66.hk",+ "t67" ~: testConcreteFilesMany [] "tests/RoundTrip/t67.hk",+ "t69x" ~: testConcreteFiles "tests/RoundTrip/t69x.0.hk" "tests/RoundTrip/t69x.expected.hk",+ "t69y" ~: testConcreteFiles "tests/RoundTrip/t69y.0.hk" "tests/RoundTrip/t69y.expected.hk"+ ]++-- t45, t46, t47 are all equivalent.+-- But t47 is worse than t45 and t46 because the importance weight generated by+-- t47 as a sampler varies between 0 and 1 whereas the importance weight generated+-- by t45 and t46 is always 1. In general it's good to reduce weight variance.+testMeasureReal :: Test+testMeasureReal = test [ + "t3" ~: testConcreteFilesMany [] "tests/RoundTrip/t3.hk",+ "t6" ~: testConcreteFiles "tests/RoundTrip/t6.0.hk" "tests/RoundTrip/t6.expected.hk",+ "t7" ~: testConcreteFiles "tests/RoundTrip/t7.0.hk" "tests/RoundTrip/t7.expected.hk",+ "t7n" ~: testConcreteFiles "tests/RoundTrip/t7n.0.hk" "tests/RoundTrip/t7n.expected.hk",+ "t8'" ~: testConcreteFiles "tests/RoundTrip/t8'.0.hk" "tests/RoundTrip/t8'.expected.hk", -- Normal is conjugate to normal+ "t9" ~: testConcreteFiles "tests/RoundTrip/t9.0.hk" "tests/RoundTrip/t9.expected.hk",+ "t13" ~: testConcreteFiles "tests/RoundTrip/t13.0.hk" "tests/RoundTrip/t13.expected.hk",+ "t14" ~: testConcreteFiles "tests/RoundTrip/t14.0.hk" "tests/RoundTrip/t14.expected.hk",+ "t21" ~: testConcreteFile "tests/RoundTrip/t21.hk",+ "t28" ~: testConcreteFilesMany [] "tests/RoundTrip/t28.hk",+ "t31" ~: testConcreteFilesMany [] "tests/RoundTrip/t31.hk",+ "t36" ~: testConcreteFilesMany [] "tests/RoundTrip/t36.hk",+ "t37" ~: testConcreteFilesMany [] "tests/RoundTrip/t37.hk",+ "t39" ~: testConcreteFilesMany [] "tests/RoundTrip/t39.hk",+ "t40" ~: testConcreteFilesMany [] "tests/RoundTrip/t40.hk",+ "t43" ~: testConcreteFiles "tests/RoundTrip/t43.0.hk" "tests/RoundTrip/t43.expected.hk",+ "t43'" ~: testConcreteFiles "tests/RoundTrip/t43.1.hk" "tests/RoundTrip/t43.expected.hk",+ "t45" ~: testConcreteFiles "tests/RoundTrip/t45.1.hk" "tests/RoundTrip/t45.expected.hk",+ "t46" ~: testConcreteFilesMany [] "tests/RoundTrip/t45.0.hk",+ "t50" ~: testConcreteFile "tests/RoundTrip/t50.hk",+ "t51" ~: testConcreteFile "tests/RoundTrip/t51.hk",+ "t68" ~: testConcreteFile "tests/RoundTrip/t68.hk",+ "t68'" ~: testConcreteFile "tests/RoundTrip/t68'.hk",+ "t70a" ~: testConcreteFiles "tests/RoundTrip/t70a.0.hk" "tests/RoundTrip/t70a.expected.hk",+ "t71a" ~: testConcreteFiles "tests/RoundTrip/t71a.0.hk" "tests/RoundTrip/t71a.expected.hk",+ "t72a" ~: testConcreteFiles "tests/RoundTrip/t72a.0.hk" "tests/RoundTrip/t72a.expected.hk",+ "t73a" ~: testConcreteFiles "tests/RoundTrip/t73a.0.hk" "tests/RoundTrip/t73a.expected.hk",+ "t74a" ~: testConcreteFiles "tests/RoundTrip/t74a.0.hk" "tests/RoundTrip/t74a.expected.hk",+ "t70b" ~: testConcreteFiles "tests/RoundTrip/t70b.0.hk" "tests/RoundTrip/t70b.expected.hk",+ "t71b" ~: testConcreteFiles "tests/RoundTrip/t71b.0.hk" "tests/RoundTrip/t71b.expected.hk",+ "t72b" ~: testConcreteFiles "tests/RoundTrip/t72b.0.hk" "tests/RoundTrip/t72b.expected.hk",+ "t73b" ~: testConcreteFiles "tests/RoundTrip/t73b.0.hk" "tests/RoundTrip/t73b.expected.hk",+ "t74b" ~: testConcreteFiles "tests/RoundTrip/t74b.0.hk" "tests/RoundTrip/t74b.expected.hk",+ "t70c" ~: testConcreteFiles "tests/RoundTrip/t70c.0.hk" "tests/RoundTrip/t70c.expected.hk",+ "t71c" ~: testConcreteFiles "tests/RoundTrip/t71c.0.hk" "tests/RoundTrip/t71c.expected.hk",+ "t72c" ~: testConcreteFiles "tests/RoundTrip/t72c.0.hk" "tests/RoundTrip/t72c.expected.hk",+ "t73c" ~: testConcreteFiles "tests/RoundTrip/t73c.0.hk" "tests/RoundTrip/t73c.expected.hk",+ "t74c" ~: testConcreteFiles "tests/RoundTrip/t74c.0.hk" "tests/RoundTrip/t74c.expected.hk",+ "t70d" ~: testConcreteFiles "tests/RoundTrip/t70d.0.hk" "tests/RoundTrip/t70d.expected.hk",+ "t71d" ~: testConcreteFiles "tests/RoundTrip/t71d.0.hk" "tests/RoundTrip/t71d.expected.hk",+ "t72d" ~: testConcreteFiles "tests/RoundTrip/t72d.0.hk" "tests/RoundTrip/t72d.expected.hk",+ "t73d" ~: testConcreteFiles "tests/RoundTrip/t73d.0.hk" "tests/RoundTrip/t73d.expected.hk",+ "t74d" ~: testConcreteFiles "tests/RoundTrip/t74d.0.hk" "tests/RoundTrip/t74d.expected.hk",+ "t76" ~: testConcreteFile "tests/RoundTrip/t76.hk",+ "t78" ~: testConcreteFiles "tests/RoundTrip/t78.0.hk" "tests/RoundTrip/t78.expected.hk",+ "t79" ~: testConcreteFiles "tests/RoundTrip/t79.0.hk" "tests/RoundTrip/t79.expected.hk", -- what does this simplify to?+ "t80" ~: testConcreteFile "tests/RoundTrip/t80.hk",+ "t81" ~: testConcreteFilesMany [] "tests/RoundTrip/t81.hk",+ -- TODO "kalman" ~: testConcreteFile "tests/RoundTrip/kalman.hk",+ -- TODO "seismic" ~: testConcreteFilesMany [] "tests/RoundTrip/seismic.hk",+ "lebesgue1" ~: testConcreteFiles+ "tests/RoundTrip/lebesgue1.hk"+ "tests/RoundTrip/lebesgue1.expected.hk",+ "lebesgue2" ~: testConcreteFiles+ "tests/RoundTrip/lebesgue2.hk"+ "tests/RoundTrip/lebesgue2.expected.hk",+ "lebesgue3" ~: testConcreteFiles "tests/RoundTrip/lebesgue3.0.hk" "tests/RoundTrip/lebesgue3.expected.hk",+ "testexponential" ~: testConcreteFile "tests/RoundTrip/testexponential.hk", -- Testing round-tripping of some other distributions+ "testcauchy" ~: testConcreteFile "tests/RoundTrip/testcauchy.hk",+ "exceptionLebesgue" ~: testConcreteFiles "tests/RoundTrip/exceptionLebesgue.0.hk" "tests/RoundTrip/exceptionLebesgue.expected.hk",+ "exceptionUniform" ~: testConcreteFiles "tests/RoundTrip/exceptionUniform.0.hk" "tests/RoundTrip/exceptionUniform.expected.hk"+ -- TODO "two_coins" ~: testConcreteFile "tests/RoundTrip/two_coins.hk" -- needs support for lists+ ]++testMeasureNat :: Test +testMeasureNat = test [ + "size" ~: testConcreteFiles "tests/RoundTrip/size.0.hk" "tests/RoundTrip/size.expected.hk"+ ]++testMeasureInt :: Test+testMeasureInt = test [ + "t75" ~: testConcreteFile "tests/RoundTrip/t75.hk",+ "t75'" ~: testConcreteFile "tests/RoundTrip/t75'.hk",+ "t83" ~: testConcreteFiles "tests/RoundTrip/t83.0.hk" "tests/RoundTrip/t83.expected.hk",+ "exceptionCounting" ~: testConcreteFilesMany [] "tests/RoundTrip/exceptionCounting.hk", -- Jacques wrote: "bug: [simp_pw_equal] implicitly assumes the ambient measure is Lebesgue"+ "exceptionSuperpose" ~: testConcreteFiles "tests/RoundTrip/exceptionSuperpose.0.hk" "tests/RoundTrip/exceptionSuperpose.expected.hk"+ ]++testMeasurePair :: Test +testMeasurePair = test [+ "t4" ~: testConcreteFiles "tests/RoundTrip/t4.0.hk" "tests/RoundTrip/t4.expected.hk",+ "t8" ~: testConcreteFile "tests/RoundTrip/t8.hk", -- For sampling efficiency (to keep importance weights at or close to 1); t8 below should read back to uses of "normal", not uses of "lebesgue" then "weight".+ "t23" ~: testConcreteFiles "tests/RoundTrip/t23.0.hk" "tests/RoundTrip/t23.expected.hk", -- was called bayesNet in Nov.06 msg by Ken for exact inference+ "t48" ~: testConcreteFile "tests/RoundTrip/t48.hk",+ "t52" ~: testConcreteFile "tests/RoundTrip/t52.hk", -- Example 1 from Chang & Pollard's Conditioning as Disintegration+ "dup" ~: testConcreteFiles "tests/RoundTrip/dup.0.hk" "tests/RoundTrip/dup.expected.hk",+ "norm" ~: testConcreteFile "tests/RoundTrip/norm.hk",+ "norm_nox" ~: testConcreteFiles "tests/RoundTrip/norm_nox.0.hk" "tests/RoundTrip/norm_nox.expected.hk",+ "norm_noy" ~: testConcreteFiles "tests/RoundTrip/norm_noy.0.hk" "tests/RoundTrip/norm_noy.expected.hk",+ "flipped_norm" ~: testConcreteFiles "tests/RoundTrip/flipped_norm.0.hk" "tests/RoundTrip/flipped_norm.expected.hk",+ "priorProp" ~: testConcreteFiles "tests/RoundTrip/priorProp.0.hk" "tests/RoundTrip/priorProp.expected.hk",+ "mhPriorProp" ~: testConcreteFiles "tests/RoundTrip/mhPriorProp.0.hk" "tests/RoundTrip/mhPriorProp.expected.hk",+ "unif2" ~: testConcreteFile "tests/RoundTrip/unif2.hk",+ "easyHMM" ~: testConcreteFile "tests/RoundTrip/easyHMM.hk",+ "testMCMCPriorProp" ~: testConcreteFile "tests/RoundTrip/testMCMCPriorProp.hk"+ ]+ +testStdChiSqRelations :: Test+testStdChiSqRelations = test [+ "t_stdChiSq_to_gamma" ~: testConcreteFiles "tests/RoundTrip/t_stdChiSq_to_gamma.0.hk" "tests/RoundTrip/t_stdChiSq_to_gamma.expected.hk",+ "t_stdChiSq_to_exponential" ~: testConcreteFiles "tests/RoundTrip2/t_stdChiSq_to_exponential.0.hk" "tests/RoundTrip2/t_stdChiSq_to_exponential.expected.hk",+ "t_rayleigh_to_stdChiSq" ~: testConcreteFiles "tests/RoundTrip2/t_rayleigh_to_stdChiSq.0.hk" "tests/RoundTrip2/t_rayleigh_to_stdChiSq.expected.hk" + ]++testExponentialRelations :: Test +testExponentialRelations = test [ + "t_exponential_to_stdChiSq" ~: testConcreteFiles "tests/RoundTrip/t_exponential_to_stdChiSq.0.hk" "tests/RoundTrip/t_exponential_to_stdChiSq.expected.hk"+ ]++testErlangRelations :: Test+testErlangRelations = test [+ "t_erlang_to_pareto" ~: testConcreteFiles "tests/RoundTrip2/t_erlang_to_pareto.0.hk" "tests/RoundTrip2/t_erlang_to_pareto.expected.hk",+ "t_erlang_to_stdChiSq" ~: testConcreteFiles "tests/RoundTrip2/t_erlang_to_stdChiSq.0.hk" "tests/RoundTrip2/t_erlang_to_stdChiSq.expected.hk" + ]++testOther :: Test+testOther = test [+ "t82" ~: testConcreteFiles "tests/RoundTrip/t82.0.hk" "tests/RoundTrip/t82.expected.hk",+ "testRoadmapProg1" ~: testConcreteFile "tests/RoundTrip/testRoadmapProg1.hk",+ "testKernel" ~: testConcreteFiles "tests/RoundTrip/testKernel.0.hk" "tests/RoundTrip/testKernel.expected.hk",+ "LDA" ~: testConcreteFilesET defaultMapleOptions+ [ "tests/RoundTrip/lda2.hk" ]+ "tests/RoundTrip/lda2_res.hk",+ "LDA - hand simplified" ~: testConcreteFilesET defaultMapleOptions+ [ "tests/RoundTrip/lda3-ds.0.hk"+ , "tests/RoundTrip/lda3-ds.1.hk" ]+ "tests/RoundTrip/lda3-ds.expected.hk",+ "gmm_gibbs" ~: testConcreteFilesET+ defaultMapleOptions { timelimit=300 }+ [ "tests/RoundTrip/gmm_gibbs.0.hk" ]+ "tests/RoundTrip/gmm_gibbs.expected.hk",+ "naive_bayes_gibbs" ~: testConcreteFilesET defaultMapleOptions+ [ "tests/RoundTrip/naive_bayes_gibbs.0.hk" ]+ "tests/RoundTrip/naive_bayes_gibbs.expected.hk",+ "\"thermometer\" pipeline" ~:+ testConcreteFilesET defaultMapleOptions+ [ "tests/RoundTrip/thermometer_workflow.hk" ]+ "tests/RoundTrip/thermometer_workflow_res.hk",+ "\"burglary\" pipeline" ~:+ testConcreteFilesET defaultMapleOptions+ [ "tests/RoundTrip/burglary_workflow.hk" ]+ "tests/RoundTrip/burglary_workflow_res.hk"+ --"testFalseDetection" ~: testStriv (lam seismicFalseDetection),+ --"testTrueDetection" ~: testStriv (lam2 seismicTrueDetection)+ --"testTrueDetectionL" ~: testStriv tdl,+ --"testTrueDetectionR" ~: testStriv tdr+ ]++allTests :: Test +allTests = test+ [ testMeasureUnit+ , testMeasureProb+ , testMeasureReal+ , testMeasurePair+ , testMeasureNat+ , testMeasureInt+ , testErlangRelations+ , testStdChiSqRelations+ , testExponentialRelations+ , testOther+ ]++----------------------------------------------------------------++t46 :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)+t46 = normal (real_ 4) (prob_ 5) >>= \x -> dirac (if_ (x < (real_ 3)) (x*x) (x-one))++t47 :: (ABT Term abt) => abt '[] ('HMeasure 'HReal)+t47 = unsafeSuperpose+ [ (one, normal (real_ 4) (prob_ 5) >>= \x -> if_ (x < (real_ 3)) (dirac (x*x)) (reject sing))+ , (one, normal (real_ 4) (prob_ 5) >>= \x -> if_ (x < (real_ 3)) (reject sing) (dirac (x-one)))+ ] -- pull out some of the intermediate expressions for independent study expr1 :: (ABT Term abt) => abt '[] ('HReal ':-> 'HProb)
haskell/Tests/TestSuite.hs view
@@ -1,4 +1,4 @@--- module Tests.TestSuite(main) where+module Main(main) where import System.Exit (exitFailure) import System.Environment (lookupEnv)@@ -11,6 +11,7 @@ import qualified Tests.Disintegrate as D import qualified Tests.Sample as E import qualified Tests.RoundTrip as RT+import qualified Tests.Relationships as REL import Test.HUnit @@ -26,7 +27,7 @@ Nothing -> test ignored allTests :: Maybe String -> Test-allTests env = test+allTests env = test $ [ TestLabel "Parser" P.allTests , TestLabel "Pretty" Pr.allTests , TestLabel "TypeCheck" TC.allTests@@ -34,16 +35,15 @@ , TestLabel "Disintegrate" D.allTests , TestLabel "Evaluate" E.allTests , TestLabel "RoundTrip" (simplifyTests RT.allTests env)+ , TestLabel "Relationships" (simplifyTests REL.allTests env) , TestLabel "ASTTransforms" TR.allTests ] main :: IO ()-main = mainWith (fmap Just . runTestTT)+main = mainWith allTests (fmap Just . runTestTT) -mainWith :: (Test -> IO (Maybe Counts)) -> IO ()-mainWith run = do+mainWith :: (Maybe String -> Test) -> (Test -> IO (Maybe Counts)) -> IO ()+mainWith mkTests run = do env <- lookupEnv "LOCAL_MAPLE"- run (allTests env) >>=+ run (mkTests env) >>= maybe (return ()) (\(Counts _ _ e f) -> if (e>0) || (f>0) then exitFailure else return ())---- maini = mainWith
haskell/Tests/TestTools.hs view
@@ -3,28 +3,38 @@ , RankNTypes , GADTs , PolyKinds+ , ScopedTypeVariables , FlexibleContexts #-} {-# OPTIONS_GHC -Wall -fwarn-tabs #-}-module Tests.TestTools where+module Tests.TestTools+ ( module Tests.TestTools+ , MapleOptions(..)+ , defaultMapleOptions)+ where import Language.Hakaru.Types.Sing-import Language.Hakaru.Parser.Parser+import Language.Hakaru.Parser.Parser (parseHakaru) import Language.Hakaru.Parser.SymbolResolve (resolveAST)-import Language.Hakaru.Command (parseAndInfer, splitLines)+import Language.Hakaru.Command (parseAndInferWithMode', Source(..),+ fileSource, noFileSource) import Language.Hakaru.Syntax.ABT import Language.Hakaru.Syntax.AST import Language.Hakaru.Syntax.TypeCheck import Language.Hakaru.Syntax.AST.Eq (alphaEq)+import Language.Hakaru.Syntax.AST.Transforms (expandTransformations+ ,expandTransformationsWith+ ,allTransformationsWithMOpts) import Language.Hakaru.Syntax.IClasses (TypeEq(..), jmEq1) import Language.Hakaru.Pretty.Concrete import Language.Hakaru.Simplify+import Language.Hakaru.Maple (MapleOptions(..), defaultMapleOptions) import Language.Hakaru.Syntax.AST.Eq() import Text.PrettyPrint (Doc) import Data.Maybe (isJust) import Data.List import qualified Data.Text as T-import qualified Data.Text.IO as IO+import qualified Data.Text.Utf8 as IO import Data.Typeable (Typeable) import Control.Exception import Control.Monad@@ -54,7 +64,8 @@ -> abt '[] a -> Assertion testS p x = do- _ <- simplify x `catch` handleException (p ++ ": simplify failed")+ _ <- simplify (expandTransformations x) `catch`+ handleException (p ++ ": simplify failed") return () testStriv @@ -62,24 +73,53 @@ -> Assertion testStriv = testS "" +testSS1+ :: (ABT Term abt)+ => String+ -> abt '[] a -- | Expected+ -> abt '[] a -- | To simplify+ -> Assertion+testSS1 = testSS1WithOpts defaultMapleOptions++testSS1WithOpts+ :: (ABT Term abt)+ => MapleOptions ()+ -> String+ -> abt '[] a -- | Expected+ -> abt '[] a -- | To simplify+ -> Assertion+testSS1WithOpts o nm t' t =+ simplifyWithOpts o (expandTransformations t) >>= \p -> assertAlphaEq nm p t'+ -- Assert that all the given Hakaru programs simplify to the given one testSS :: (ABT Term abt) => String -> [(abt '[] a)] -> abt '[] a - -> Assertion-testSS nm ts t' = - mapM_ (\t -> do p <- simplify t - assertAlphaEq nm p t')- (t':ts)+ -> Test+testSS nm ts t' = test $ map (testSS1 nm t') (t':ts) testSStriv :: [(TrivialABT Term '[] a)] -> TrivialABT Term '[] a - -> Assertion+ -> Test testSStriv = testSS "" +-- | Assert that the given programs are equal after expanding transformations.+-- By convention, the first program is taken to be the expected output, but+-- this function is symmetric.+testET+ :: (ABT Term abt)+ => MapleOptions ()+ -> String+ -> abt '[] a+ -> abt '[] a+ -> Assertion+testET opts nm t0 t1 =+ let et = expandTransformationsWith (allTransformationsWithMOpts opts) in+ mapM et [t0, t1] >>= \[t0', t1'] -> assertAlphaEq nm t0' t1'+ assertAlphaEq :: (ABT Term abt) => String@@ -99,21 +139,45 @@ ] p = if null preface then "" else preface ++ "\n" +testWithConcreteImport ::+ (ABT Term abt)+ => Source+ -> TypeCheckMode+ -> (forall a. Sing a -> abt '[] a -> Assertion)+ -> Assertion+testWithConcreteImport s mode k =+ either (assertFailure . T.unpack) (\(TypedAST typ ast) -> k typ ast) =<<+ parseAndInferWithMode' s mode+ testWithConcrete :: (ABT Term abt) => T.Text -> TypeCheckMode -> (forall a. Sing a -> abt '[] a -> Assertion) -> Assertion-testWithConcrete s mode k =- case parseHakaru s of- Left err -> assertFailure (show err)- Right past ->- let m = inferType (resolveAST past) in- case runTCM m (splitLines s) mode of- Left err -> assertFailure (show err)- Right (TypedAST typ ast) -> k typ ast+testWithConcrete t m k = testWithConcreteImport (noFileSource t) m k +-- Like testWithConcrete, but for many programs +testWithConcreteMany + :: forall abt. (ABT Term abt) + => FilePath+ -> [FilePath]+ -> TypeCheckMode + -> (forall a . Sing a -> abt '[] a -> abt '[] a -> Assertion) + -> Test+testWithConcreteMany t ts mode k = test $ map (mkT t) (t:ts)+ where mkT :: FilePath -> FilePath -> Assertion+ mkT t0' t1' =+ mapM (\t -> fileSource t <$> IO.readFile t) [t0', t1'] >>= \[t0,t1] ->+ testWithConcreteImport t0 mode $ \t0ty (t0p :: abt '[] x0) ->+ testWithConcreteImport t1 mode $ \t1ty (t1p :: abt '[] x1) ->+ case jmEq1 t0ty t1ty of+ Just Refl -> k t0ty t0p t1p+ Nothing -> assertFailure $ concat+ [ "Files don't have same type ("+ , T.unpack (source t0), " :: ", prettyTypeS t0ty+ , ", "+ , T.unpack (source t1), " :: ", prettyTypeS t1ty ] testWithConcrete' :: T.Text@@ -122,22 +186,55 @@ -> Assertion testWithConcrete' = testWithConcrete +testWithConcreteMany'+ :: FilePath+ -> [FilePath] + -> TypeCheckMode + -> (forall a . Sing a + -> TrivialABT Term '[] a+ -> TrivialABT Term '[] a+ -> Assertion) + -> Test+testWithConcreteMany' = testWithConcreteMany++-- Like testSStriv but for many concrete files+testConcreteFilesMany+ :: [FilePath] + -> FilePath+ -> Test+testConcreteFilesMany = testConcreteFilesManyWithOpts defaultMapleOptions++-- TODO: Should there be a variant with options for each program?+testConcreteFilesManyWithOpts+ :: MapleOptions ()+ -> [FilePath]+ -> FilePath+ -> Test+testConcreteFilesManyWithOpts o fs f =+ testWithConcreteMany' f fs LaxMode $+ \_ -> testSS1WithOpts o ""++testConcreteFilesET+ :: MapleOptions ()+ -> [FilePath]+ -> FilePath+ -> Test+testConcreteFilesET o fs f =+ testWithConcreteMany' f fs LaxMode $+ \_ -> testET o ""++-- Like testSStriv but for two concrete files testConcreteFiles :: FilePath -> FilePath- -> Assertion-testConcreteFiles f1 f2 = do- t1 <- IO.readFile f1- t2 <- IO.readFile f2- case (parseAndInfer t1, parseAndInfer t2) of- (Left err, _) -> assertFailure (show err)- (_, Left err) -> assertFailure (show err)- (Right (TypedAST typ1 ast1), Right (TypedAST typ2 ast2)) -> do- ast1' <- simplify ast1- ast2' <- simplify ast2- case jmEq1 typ1 typ2 of- Just Refl -> assertAlphaEq "" ast1' ast2'- Nothing -> assertFailure "files don't have same type"+ -> Test+testConcreteFiles f1 f2 = testConcreteFilesMany [f1] f2 ++-- Like testStriv but for a concrete file. +testConcreteFile :: FilePath -> Assertion+testConcreteFile f =+ IO.readFile f >>= \t -> testWithConcreteImport (fileSource f t) LaxMode $+ \_ -> testStriv ignore :: a -> Assertion ignore _ = assertFailure "ignored" -- ignoring a test reports as a failure