unison-core1-0.0.0
Safe HaskellSafe-Inferred
LanguageHaskell2010

Unison.Type

Synopsis

Documentation

data F a Source #

Base functor for types in the Unison language

Constructors

Ref TypeReference 
Arrow a a 
Ann a Kind 
App a a 
Effect a a 
Effects [a] 
Forall a 
IntroOuter a 

Instances

Instances details
Foldable F Source # 
Instance details

Defined in Unison.Type

Methods

fold :: Monoid m => F m -> m #

foldMap :: Monoid m => (a -> m) -> F a -> m #

foldMap' :: Monoid m => (a -> m) -> F a -> m #

foldr :: (a -> b -> b) -> b -> F a -> b #

foldr' :: (a -> b -> b) -> b -> F a -> b #

foldl :: (b -> a -> b) -> b -> F a -> b #

foldl' :: (b -> a -> b) -> b -> F a -> b #

foldr1 :: (a -> a -> a) -> F a -> a #

foldl1 :: (a -> a -> a) -> F a -> a #

toList :: F a -> [a] #

null :: F a -> Bool #

length :: F a -> Int #

elem :: Eq a => a -> F a -> Bool #

maximum :: Ord a => F a -> a #

minimum :: Ord a => F a -> a #

sum :: Num a => F a -> a #

product :: Num a => F a -> a #

Traversable F Source # 
Instance details

Defined in Unison.Type

Methods

traverse :: Applicative f => (a -> f b) -> F a -> f (F b) #

sequenceA :: Applicative f => F (f a) -> f (F a) #

mapM :: Monad m => (a -> m b) -> F a -> m (F b) #

sequence :: Monad m => F (m a) -> m (F a) #

Functor F Source # 
Instance details

Defined in Unison.Type

Methods

fmap :: (a -> b) -> F a -> F b #

(<$) :: a -> F b -> F a #

Generic1 F Source # 
Instance details

Defined in Unison.Type

Associated Types

type Rep1 F :: k -> Type #

Methods

from1 :: forall (a :: k). F a -> Rep1 F a #

to1 :: forall (a :: k). Rep1 F a -> F a #

Generic (F a) Source # 
Instance details

Defined in Unison.Type

Associated Types

type Rep (F a) :: Type -> Type #

Methods

from :: F a -> Rep (F a) x #

to :: Rep (F a) x -> F a #

Show a => Show (F a) Source # 
Instance details

Defined in Unison.Type

Methods

showsPrec :: Int -> F a -> ShowS #

show :: F a -> String #

showList :: [F a] -> ShowS #

Eq a => Eq (F a) Source # 
Instance details

Defined in Unison.Type

Methods

(==) :: F a -> F a -> Bool #

(/=) :: F a -> F a -> Bool #

Ord a => Ord (F a) Source # 
Instance details

Defined in Unison.Type

Methods

compare :: F a -> F a -> Ordering #

(<) :: F a -> F a -> Bool #

(<=) :: F a -> F a -> Bool #

(>) :: F a -> F a -> Bool #

(>=) :: F a -> F a -> Bool #

max :: F a -> F a -> F a #

min :: F a -> F a -> F a #

type Rep1 F Source # 
Instance details

Defined in Unison.Type

type Rep1 F = D1 ('MetaData "F" "Unison.Type" "unison-core1-0.0.0-Kp7ZcNnt5XdB8ImvFwyntI" 'False) (((C1 ('MetaCons "Ref" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 TypeReference)) :+: C1 ('MetaCons "Arrow" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) Par1 :*: S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) Par1)) :+: (C1 ('MetaCons "Ann" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) Par1 :*: S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Kind)) :+: C1 ('MetaCons "App" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) Par1 :*: S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) Par1))) :+: ((C1 ('MetaCons "Effect" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) Par1 :*: S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) Par1) :+: C1 ('MetaCons "Effects" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec1 List))) :+: (C1 ('MetaCons "Forall" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) Par1) :+: C1 ('MetaCons "IntroOuter" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) Par1))))
type Rep (F a) Source # 
Instance details

Defined in Unison.Type

type Rep (F a) = D1 ('MetaData "F" "Unison.Type" "unison-core1-0.0.0-Kp7ZcNnt5XdB8ImvFwyntI" 'False) (((C1 ('MetaCons "Ref" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 TypeReference)) :+: C1 ('MetaCons "Arrow" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a) :*: S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a))) :+: (C1 ('MetaCons "Ann" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a) :*: S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Kind)) :+: C1 ('MetaCons "App" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a) :*: S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a)))) :+: ((C1 ('MetaCons "Effect" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a) :*: S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a)) :+: C1 ('MetaCons "Effects" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 [a]))) :+: (C1 ('MetaCons "Forall" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a)) :+: C1 ('MetaCons "IntroOuter" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a)))))

type Type v a = Term F v a Source #

Types are represented as ABTs over the base functor F, with variables in v

wrapV :: Ord v => Type v a -> Type (V v) a Source #

freeVars :: Type v a -> Set v Source #

bindExternal :: Var v => [(v, TypeReference)] -> Type v a -> Type v a Source #

bindReferences :: Var v => (v -> Name) -> Set v -> Map Name TypeReference -> Type v a -> ResolutionResult a (Type v a) Source #

newtype Monotype v a Source #

Constructors

Monotype 

Fields

Instances

Instances details
Show v => Show (Monotype v a) Source # 
Instance details

Defined in Unison.Type

Methods

showsPrec :: Int -> Monotype v a -> ShowS #

show :: Monotype v a -> String #

showList :: [Monotype v a] -> ShowS #

Var v => Eq (Monotype v a) Source # 
Instance details

Defined in Unison.Type

Methods

(==) :: Monotype v a -> Monotype v a -> Bool #

(/=) :: Monotype v a -> Monotype v a -> Bool #

monotype :: Var v => Type v a -> Maybe (Monotype v a) Source #

arity :: Type v a -> Int Source #

pattern Ref' :: TypeReference -> Term F v a Source #

pattern Arrow' :: Term F v a -> Term F v a -> Term F v a Source #

pattern Arrow'' :: Ord v => Term F v a -> [Type v a] -> Type v a -> Term F v a Source #

pattern Arrows' :: [Type v a] -> Type v a Source #

pattern EffectfulArrows' :: Type v a -> [(Maybe [Type v a], Type v a)] -> Type v a Source #

pattern Ann' :: Term F v a -> Kind -> Term F v a Source #

pattern App' :: Term F v a -> Term F v a -> Term F v a Source #

pattern Apps' :: Type v a -> [Type v a] -> Type v a Source #

pattern Pure' :: Ord v => Type v a -> Type v a Source #

pattern Request' :: [Type v a] -> Type v a -> Type v a Source #

pattern Effects' :: [Term F v a] -> Term F v a Source #

pattern Effect1' :: Term F v a -> Term F v a -> Term F v a Source #

pattern Effect' :: Ord v => [Type v a] -> Type v a -> Type v a Source #

pattern Effect'' :: Ord v => [Type v a] -> Type v a -> Type v a Source #

pattern Effect0' :: Ord v => [Type v a] -> Type v a -> Type v a Source #

pattern Forall' :: Var v => Subst F v a -> Term F v a Source #

pattern IntroOuter' :: Var v => Subst F v a -> Term F v a Source #

pattern IntroOuterNamed' :: v -> Term F v a -> Term F v a Source #

pattern ForallsNamed' :: [v] -> Type v a -> Type v a Source #

pattern ForallsNamedOpt' :: [v] -> Type v a -> Type v a Source #

unForallsOpt :: Type v a -> ([v], Type v a) Source #

pattern ForallNamed' :: v -> Term F v a -> Term F v a Source #

pattern Var' :: v -> Term f v a Source #

pattern Cycle' :: [v] -> f (Term f v a) -> Term f v a Source #

pattern Abs' :: (Foldable f, Functor f, Var v) => Subst f v a -> Term f v a Source #

unPure :: Ord v => Type v a -> Maybe (Type v a) Source #

unArrows :: Type v a -> Maybe [Type v a] Source #

unEffectfulArrows :: Type v a -> Maybe (Type v a, [(Maybe [Type v a], Type v a)]) Source #

unApps :: Type v a -> Maybe (Type v a, [Type v a]) Source #

unIntroOuters :: Type v a -> Maybe ([v], Type v a) Source #

unForalls :: Type v a -> Maybe ([v], Type v a) Source #

unEffect0 :: Ord v => Type v a -> ([Type v a], Type v a) Source #

unEffects1 :: Ord v => Type v a -> Maybe ([Type v a], Type v a) Source #

isArrow :: Var v => Type v a -> Bool Source #

True if the given type is a function, possibly quantified

ref :: Ord v => a -> TypeReference -> Type v a Source #

refId :: Ord v => a -> Id -> Type v a Source #

termLink :: Ord v => a -> Type v a Source #

typeLink :: Ord v => a -> Type v a Source #

any :: Ord v => a -> Type v a Source #

builtin :: Ord v => a -> Text -> Type v a Source #

int :: Ord v => a -> Type v a Source #

nat :: Ord v => a -> Type v a Source #

float :: Ord v => a -> Type v a Source #

boolean :: Ord v => a -> Type v a Source #

text :: Ord v => a -> Type v a Source #

char :: Ord v => a -> Type v a Source #

fileHandle :: Ord v => a -> Type v a Source #

processHandle :: Ord v => a -> Type v a Source #

threadId :: Ord v => a -> Type v a Source #

builtinIO :: Ord v => a -> Type v a Source #

scopeType :: Ord v => a -> Type v a Source #

refType :: Ord v => a -> Type v a Source #

iarrayType :: Ord v => a -> Type v a Source #

marrayType :: Ord v => a -> Type v a Source #

ibytearrayType :: Ord v => a -> Type v a Source #

mbytearrayType :: Ord v => a -> Type v a Source #

socket :: Ord v => a -> Type v a Source #

udpSocket :: Ord v => a -> Type v a Source #

udpListenSocket :: Ord v => a -> Type v a Source #

udpClientSockAddr :: Ord v => a -> Type v a Source #

list :: Ord v => a -> Type v a Source #

bytes :: Ord v => a -> Type v a Source #

effectType :: Ord v => a -> Type v a Source #

code :: Ord v => a -> Type v a Source #

value :: Ord v => a -> Type v a Source #

app :: Ord v => a -> Type v a -> Type v a -> Type v a Source #

apps :: Ord v => Type v a -> [(a, Type v a)] -> Type v a Source #

app' :: (Ord v, Semigroup a) => Type v a -> Type v a -> Type v a Source #

apps' :: (Semigroup a, Ord v) => Type v a -> [Type v a] -> Type v a Source #

arrow :: Ord v => a -> Type v a -> Type v a -> Type v a Source #

arrow' :: (Semigroup a, Ord v) => Type v a -> Type v a -> Type v a Source #

ann :: Ord v => a -> Type v a -> Kind -> Type v a Source #

forAll :: Ord v => a -> v -> Type v a -> Type v a Source #

introOuter :: Ord v => a -> v -> Type v a -> Type v a Source #

iff :: Var v => Type v () Source #

iff' :: Var v => a -> Type v a Source #

iff2 :: Var v => a -> Type v a Source #

andor :: Ord v => Type v () Source #

andor' :: Ord v => a -> Type v a Source #

var :: Ord v => a -> v -> Type v a Source #

v' :: Var v => Text -> Type v () Source #

av' :: Var v => a -> Text -> Type v a Source #

forAll' :: Var v => a -> [Text] -> Type v a -> Type v a Source #

foralls :: Ord v => a -> [v] -> Type v a -> Type v a Source #

arrows :: Ord v => [(a, Type v a)] -> Type v a -> Type v a Source #

effect :: Ord v => a -> [Type v a] -> Type v a -> Type v a Source #

effects :: Ord v => a -> [Type v a] -> Type v a Source #

effect1 :: Ord v => a -> Type v a -> Type v a -> Type v a Source #

flattenEffects :: Type v a -> [Type v a] Source #

effectV :: Ord v => a -> (a, Type v a) -> (a, Type v a) -> Type v a Source #

stripEffect :: Ord v => Type v a -> ([Type v a], Type v a) Source #

flipApply :: Var v => Type v () -> Type v () Source #

generalize' :: Var v => Type -> Type v a -> Type v a Source #

generalize :: Ord v => [v] -> Type v a -> Type v a Source #

Bind the given variables with an outer forAll, if they are used in t.

unforall :: Type v a -> Type v a Source #

unforall' :: Type v a -> ([v], Type v a) Source #

usesEffects :: Ord v => Type v a -> Bool Source #

freeEffectVars :: Ord v => Type v a -> Set v Source #

existentializeArrows :: (Ord v, Monad m) => m v -> Type v a -> m (Type v a) Source #

purifyArrows :: Ord v => Type v a -> Type v a Source #

removeEffectVars :: Var v => Bool -> Set v -> Type v a -> Type v a Source #

removeEmptyEffects :: Ord v => Type v a -> Type v a Source #

removePureEffects :: Var v => Bool -> Type v a -> Type v a Source #

editFunctionResult :: forall v a. Ord v => (Type v a -> Type v a) -> Type v a -> Type v a Source #

generalizeLowercase :: Var v => Set v -> Type v a -> Type v a Source #

Bind all free variables (not in except) that start with a lowercase letter and are unqualified with an outer forall. `a -> a` becomes `∀ a . a -> a` `B -> B` becomes `B -> B` (not changed) `.foo -> .foo` becomes `.foo -> .foo` (not changed) `.foo.bar -> blarrg.woot` becomes `.foo.bar -> blarrg.woot` (unchanged)

freeVarsToOuters :: Ord v => Set v -> Type v a -> Type v a Source #

normalizeForallOrder :: forall v a. Var v => Type v a -> Type v a Source #

cleanupVars :: Var v => [Type v a] -> [Type v a] Source #

This function removes all variable shadowing from the types and reduces fresh ids to the minimum possible to avoid ambiguity. Useful when showing two different types.

cleanupVarsMap :: Var v => [Type v a] -> Map v v Source #

cleanupVars1' :: Var v => Map v v -> Type v a -> Type v a Source #

cleanupVars1 :: Var v => Type v a -> Type v a Source #

This function removes all variable shadowing from the type and reduces fresh ids to the minimum possible to avoid ambiguity.

cleanups :: Var v => [Type v a] -> [Type v a] Source #

cleanup :: Var v => Type v a -> Type v a Source #