module Language.Egison.Type.TypedDesugar
( desugarTypedExprT
, desugarTypedTopExprT
, desugarTypedTopExprT_TensorMapOnly
, desugarTypedTopExprT_TypeClassOnly
) where
import Language.Egison.Data (EvalM)
import Language.Egison.EvalState (MonadEval(..))
import Language.Egison.IExpr (TIExpr(..), TITopExpr(..), extractNameFromVar, stringToVar)
import Language.Egison.Type.Env (lookupEnv)
import Language.Egison.Type.TensorMapInsertion (insertTensorMaps)
import Language.Egison.Type.TypeClassExpand (expandTypeClassMethodsT, expandTypeClassMethodsInPattern, addDictionaryParametersT, applyConcreteConstraintDictionaries, applyConcreteConstraintDictionariesInPattern)
desugarTypedExprT :: TIExpr -> EvalM TIExpr
desugarTypedExprT :: TIExpr -> EvalM TIExpr
desugarTypedExprT TIExpr
tiexpr = do
TIExpr
tiexpr' <- TIExpr -> EvalM TIExpr
insertTensorMaps TIExpr
tiexpr
TIExpr
tiexpr'' <- TIExpr -> EvalM TIExpr
expandTypeClassMethodsT TIExpr
tiexpr'
TIExpr -> EvalM TIExpr
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return TIExpr
tiexpr''
desugarTypedTopExprT :: TITopExpr -> EvalM (Maybe TITopExpr)
desugarTypedTopExprT :: TITopExpr -> EvalM (Maybe TITopExpr)
desugarTypedTopExprT TITopExpr
topExpr = case TITopExpr
topExpr of
TIDefine TypeScheme
scheme Var
var TIExpr
tiexpr -> do
TIExpr
tiexpr' <- TIExpr -> EvalM TIExpr
desugarTypedExprT TIExpr
tiexpr
TIExpr
tiexpr'' <- TIExpr -> EvalM TIExpr
applyConcreteConstraintDictionaries TIExpr
tiexpr'
TIExpr
tiexpr''' <- TypeScheme -> TIExpr -> EvalM TIExpr
addDictionaryParametersT TypeScheme
scheme TIExpr
tiexpr''
Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe TITopExpr -> EvalM (Maybe TITopExpr))
-> Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a b. (a -> b) -> a -> b
$ TITopExpr -> Maybe TITopExpr
forall a. a -> Maybe a
Just (TypeScheme -> Var -> TIExpr -> TITopExpr
TIDefine TypeScheme
scheme Var
var TIExpr
tiexpr''')
TITest TIExpr
tiexpr -> do
TIExpr
tiexpr' <- TIExpr -> EvalM TIExpr
desugarTypedExprT TIExpr
tiexpr
Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe TITopExpr -> EvalM (Maybe TITopExpr))
-> Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a b. (a -> b) -> a -> b
$ TITopExpr -> Maybe TITopExpr
forall a. a -> Maybe a
Just (TIExpr -> TITopExpr
TITest TIExpr
tiexpr')
TIExecute TIExpr
tiexpr -> do
TIExpr
tiexpr' <- TIExpr -> EvalM TIExpr
desugarTypedExprT TIExpr
tiexpr
Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe TITopExpr -> EvalM (Maybe TITopExpr))
-> Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a b. (a -> b) -> a -> b
$ TITopExpr -> Maybe TITopExpr
forall a. a -> Maybe a
Just (TIExpr -> TITopExpr
TIExecute TIExpr
tiexpr')
TILoadFile String
path ->
Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe TITopExpr -> EvalM (Maybe TITopExpr))
-> Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a b. (a -> b) -> a -> b
$ TITopExpr -> Maybe TITopExpr
forall a. a -> Maybe a
Just (String -> TITopExpr
TILoadFile String
path)
TILoad String
lib ->
Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe TITopExpr -> EvalM (Maybe TITopExpr))
-> Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a b. (a -> b) -> a -> b
$ TITopExpr -> Maybe TITopExpr
forall a. a -> Maybe a
Just (String -> TITopExpr
TILoad String
lib)
TIDefineMany [(Var, TIExpr)]
bindings -> do
[(Var, TIExpr)]
bindings' <- ((Var, TIExpr)
-> StateT EvalState (ExceptT EgisonError RuntimeM) (Var, TIExpr))
-> [(Var, TIExpr)]
-> StateT EvalState (ExceptT EgisonError RuntimeM) [(Var, TIExpr)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (\(Var
var, TIExpr
tiexpr) -> do
TIExpr
tiexpr' <- TIExpr -> EvalM TIExpr
desugarTypedExprT TIExpr
tiexpr
TypeEnv
typeEnv <- StateT EvalState (ExceptT EgisonError RuntimeM) TypeEnv
forall (m :: * -> *). MonadEval m => m TypeEnv
getTypeEnv
let varName :: String
varName = Var -> String
extractNameFromVar Var
var
scheme :: TypeScheme
scheme = case Var -> TypeEnv -> Maybe TypeScheme
lookupEnv (String -> Var
stringToVar String
varName) TypeEnv
typeEnv of
Just TypeScheme
ts -> TypeScheme
ts
Maybe TypeScheme
Nothing -> TIExpr -> TypeScheme
tiScheme TIExpr
tiexpr'
TIExpr
tiexpr'' <- TypeScheme -> TIExpr -> EvalM TIExpr
addDictionaryParametersT TypeScheme
scheme TIExpr
tiexpr'
(Var, TIExpr)
-> StateT EvalState (ExceptT EgisonError RuntimeM) (Var, TIExpr)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Var
var, TIExpr
tiexpr'')) [(Var, TIExpr)]
bindings
Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe TITopExpr -> EvalM (Maybe TITopExpr))
-> Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a b. (a -> b) -> a -> b
$ TITopExpr -> Maybe TITopExpr
forall a. a -> Maybe a
Just ([(Var, TIExpr)] -> TITopExpr
TIDefineMany [(Var, TIExpr)]
bindings')
TIDeclareSymbol [String]
names Type
ty ->
Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe TITopExpr -> EvalM (Maybe TITopExpr))
-> Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a b. (a -> b) -> a -> b
$ TITopExpr -> Maybe TITopExpr
forall a. a -> Maybe a
Just ([String] -> Type -> TITopExpr
TIDeclareSymbol [String]
names Type
ty)
TIPatternFunctionDecl String
name TypeScheme
typeScheme [(String, Type)]
params Type
retType TIPattern
body -> do
TIPattern
body' <- TIPattern -> EvalM TIPattern
expandTypeClassMethodsInPattern TIPattern
body
TIPattern
body'' <- TIPattern -> EvalM TIPattern
applyConcreteConstraintDictionariesInPattern TIPattern
body'
Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe TITopExpr -> EvalM (Maybe TITopExpr))
-> Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a b. (a -> b) -> a -> b
$ TITopExpr -> Maybe TITopExpr
forall a. a -> Maybe a
Just (String
-> TypeScheme -> [(String, Type)] -> Type -> TIPattern -> TITopExpr
TIPatternFunctionDecl String
name TypeScheme
typeScheme [(String, Type)]
params Type
retType TIPattern
body'')
desugarTypedTopExprT_TensorMapOnly :: TITopExpr -> EvalM (Maybe TITopExpr)
desugarTypedTopExprT_TensorMapOnly :: TITopExpr -> EvalM (Maybe TITopExpr)
desugarTypedTopExprT_TensorMapOnly TITopExpr
topExpr = case TITopExpr
topExpr of
TIDefine TypeScheme
scheme Var
var TIExpr
tiexpr -> do
TIExpr
tiexpr' <- TIExpr -> EvalM TIExpr
insertTensorMaps TIExpr
tiexpr
Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe TITopExpr -> EvalM (Maybe TITopExpr))
-> Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a b. (a -> b) -> a -> b
$ TITopExpr -> Maybe TITopExpr
forall a. a -> Maybe a
Just (TypeScheme -> Var -> TIExpr -> TITopExpr
TIDefine TypeScheme
scheme Var
var TIExpr
tiexpr')
TITest TIExpr
tiexpr -> do
TIExpr
tiexpr' <- TIExpr -> EvalM TIExpr
insertTensorMaps TIExpr
tiexpr
Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe TITopExpr -> EvalM (Maybe TITopExpr))
-> Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a b. (a -> b) -> a -> b
$ TITopExpr -> Maybe TITopExpr
forall a. a -> Maybe a
Just (TIExpr -> TITopExpr
TITest TIExpr
tiexpr')
TIExecute TIExpr
tiexpr -> do
TIExpr
tiexpr' <- TIExpr -> EvalM TIExpr
insertTensorMaps TIExpr
tiexpr
Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe TITopExpr -> EvalM (Maybe TITopExpr))
-> Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a b. (a -> b) -> a -> b
$ TITopExpr -> Maybe TITopExpr
forall a. a -> Maybe a
Just (TIExpr -> TITopExpr
TIExecute TIExpr
tiexpr')
TILoadFile String
path ->
Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe TITopExpr -> EvalM (Maybe TITopExpr))
-> Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a b. (a -> b) -> a -> b
$ TITopExpr -> Maybe TITopExpr
forall a. a -> Maybe a
Just (String -> TITopExpr
TILoadFile String
path)
TILoad String
lib ->
Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe TITopExpr -> EvalM (Maybe TITopExpr))
-> Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a b. (a -> b) -> a -> b
$ TITopExpr -> Maybe TITopExpr
forall a. a -> Maybe a
Just (String -> TITopExpr
TILoad String
lib)
TIDefineMany [(Var, TIExpr)]
bindings -> do
[(Var, TIExpr)]
bindings' <- ((Var, TIExpr)
-> StateT EvalState (ExceptT EgisonError RuntimeM) (Var, TIExpr))
-> [(Var, TIExpr)]
-> StateT EvalState (ExceptT EgisonError RuntimeM) [(Var, TIExpr)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (\(Var
var, TIExpr
tiexpr) -> do
TIExpr
tiexpr' <- TIExpr -> EvalM TIExpr
insertTensorMaps TIExpr
tiexpr
(Var, TIExpr)
-> StateT EvalState (ExceptT EgisonError RuntimeM) (Var, TIExpr)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Var
var, TIExpr
tiexpr')) [(Var, TIExpr)]
bindings
Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe TITopExpr -> EvalM (Maybe TITopExpr))
-> Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a b. (a -> b) -> a -> b
$ TITopExpr -> Maybe TITopExpr
forall a. a -> Maybe a
Just ([(Var, TIExpr)] -> TITopExpr
TIDefineMany [(Var, TIExpr)]
bindings')
TIDeclareSymbol [String]
names Type
ty ->
Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe TITopExpr -> EvalM (Maybe TITopExpr))
-> Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a b. (a -> b) -> a -> b
$ TITopExpr -> Maybe TITopExpr
forall a. a -> Maybe a
Just ([String] -> Type -> TITopExpr
TIDeclareSymbol [String]
names Type
ty)
TIPatternFunctionDecl String
name TypeScheme
typeScheme [(String, Type)]
params Type
retType TIPattern
body ->
Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe TITopExpr -> EvalM (Maybe TITopExpr))
-> Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a b. (a -> b) -> a -> b
$ TITopExpr -> Maybe TITopExpr
forall a. a -> Maybe a
Just (String
-> TypeScheme -> [(String, Type)] -> Type -> TIPattern -> TITopExpr
TIPatternFunctionDecl String
name TypeScheme
typeScheme [(String, Type)]
params Type
retType TIPattern
body)
desugarTypedTopExprT_TypeClassOnly :: TITopExpr -> EvalM (Maybe TITopExpr)
desugarTypedTopExprT_TypeClassOnly :: TITopExpr -> EvalM (Maybe TITopExpr)
desugarTypedTopExprT_TypeClassOnly TITopExpr
topExpr = case TITopExpr
topExpr of
TIDefine TypeScheme
scheme Var
var TIExpr
tiexpr -> do
TIExpr
tiexpr' <- TIExpr -> EvalM TIExpr
expandTypeClassMethodsT TIExpr
tiexpr
TIExpr
tiexpr'' <- TIExpr -> EvalM TIExpr
applyConcreteConstraintDictionaries TIExpr
tiexpr'
TIExpr
tiexpr''' <- TypeScheme -> TIExpr -> EvalM TIExpr
addDictionaryParametersT TypeScheme
scheme TIExpr
tiexpr''
Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe TITopExpr -> EvalM (Maybe TITopExpr))
-> Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a b. (a -> b) -> a -> b
$ TITopExpr -> Maybe TITopExpr
forall a. a -> Maybe a
Just (TypeScheme -> Var -> TIExpr -> TITopExpr
TIDefine TypeScheme
scheme Var
var TIExpr
tiexpr''')
TITest TIExpr
tiexpr -> do
TIExpr
tiexpr' <- TIExpr -> EvalM TIExpr
expandTypeClassMethodsT TIExpr
tiexpr
Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe TITopExpr -> EvalM (Maybe TITopExpr))
-> Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a b. (a -> b) -> a -> b
$ TITopExpr -> Maybe TITopExpr
forall a. a -> Maybe a
Just (TIExpr -> TITopExpr
TITest TIExpr
tiexpr')
TIExecute TIExpr
tiexpr -> do
TIExpr
tiexpr' <- TIExpr -> EvalM TIExpr
expandTypeClassMethodsT TIExpr
tiexpr
Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe TITopExpr -> EvalM (Maybe TITopExpr))
-> Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a b. (a -> b) -> a -> b
$ TITopExpr -> Maybe TITopExpr
forall a. a -> Maybe a
Just (TIExpr -> TITopExpr
TIExecute TIExpr
tiexpr')
TILoadFile String
path ->
Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe TITopExpr -> EvalM (Maybe TITopExpr))
-> Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a b. (a -> b) -> a -> b
$ TITopExpr -> Maybe TITopExpr
forall a. a -> Maybe a
Just (String -> TITopExpr
TILoadFile String
path)
TILoad String
lib ->
Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe TITopExpr -> EvalM (Maybe TITopExpr))
-> Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a b. (a -> b) -> a -> b
$ TITopExpr -> Maybe TITopExpr
forall a. a -> Maybe a
Just (String -> TITopExpr
TILoad String
lib)
TIDefineMany [(Var, TIExpr)]
bindings -> do
[(Var, TIExpr)]
bindings' <- ((Var, TIExpr)
-> StateT EvalState (ExceptT EgisonError RuntimeM) (Var, TIExpr))
-> [(Var, TIExpr)]
-> StateT EvalState (ExceptT EgisonError RuntimeM) [(Var, TIExpr)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (\(Var
var, TIExpr
tiexpr) -> do
TIExpr
tiexpr' <- TIExpr -> EvalM TIExpr
expandTypeClassMethodsT TIExpr
tiexpr
TypeEnv
typeEnv <- StateT EvalState (ExceptT EgisonError RuntimeM) TypeEnv
forall (m :: * -> *). MonadEval m => m TypeEnv
getTypeEnv
let varName :: String
varName = Var -> String
extractNameFromVar Var
var
scheme :: TypeScheme
scheme = case Var -> TypeEnv -> Maybe TypeScheme
lookupEnv (String -> Var
stringToVar String
varName) TypeEnv
typeEnv of
Just TypeScheme
ts -> TypeScheme
ts
Maybe TypeScheme
Nothing -> TIExpr -> TypeScheme
tiScheme TIExpr
tiexpr'
TIExpr
tiexpr'' <- TypeScheme -> TIExpr -> EvalM TIExpr
addDictionaryParametersT TypeScheme
scheme TIExpr
tiexpr'
(Var, TIExpr)
-> StateT EvalState (ExceptT EgisonError RuntimeM) (Var, TIExpr)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Var
var, TIExpr
tiexpr'')) [(Var, TIExpr)]
bindings
Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe TITopExpr -> EvalM (Maybe TITopExpr))
-> Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a b. (a -> b) -> a -> b
$ TITopExpr -> Maybe TITopExpr
forall a. a -> Maybe a
Just ([(Var, TIExpr)] -> TITopExpr
TIDefineMany [(Var, TIExpr)]
bindings')
TIDeclareSymbol [String]
names Type
ty ->
Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe TITopExpr -> EvalM (Maybe TITopExpr))
-> Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a b. (a -> b) -> a -> b
$ TITopExpr -> Maybe TITopExpr
forall a. a -> Maybe a
Just ([String] -> Type -> TITopExpr
TIDeclareSymbol [String]
names Type
ty)
TIPatternFunctionDecl String
name TypeScheme
typeScheme [(String, Type)]
params Type
retType TIPattern
body -> do
TIPattern
body' <- TIPattern -> EvalM TIPattern
expandTypeClassMethodsInPattern TIPattern
body
TIPattern
body'' <- TIPattern -> EvalM TIPattern
applyConcreteConstraintDictionariesInPattern TIPattern
body'
Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe TITopExpr -> EvalM (Maybe TITopExpr))
-> Maybe TITopExpr -> EvalM (Maybe TITopExpr)
forall a b. (a -> b) -> a -> b
$ TITopExpr -> Maybe TITopExpr
forall a. a -> Maybe a
Just (String
-> TypeScheme -> [(String, Type)] -> Type -> TIPattern -> TITopExpr
TIPatternFunctionDecl String
name TypeScheme
typeScheme [(String, Type)]
params Type
retType TIPattern
body'')