def __mul__(self, fn): """ (*) :: (b -> c) -> (a -> b) -> (a -> c) * is the function compose operator, equivalent to . in Haskell """ if not isinstance(fn, TypedFunc): return fn.__rmul__(self) env = {id(self):self.fn_type, id(fn):fn.fn_type} compose = Lam("arg", App(Var(id(self)), App(Var(id(fn)), Var("arg")))) newtype = analyze(compose, env) composed_fn = lambda x: self.func(fn.func(x)) newargs = [fn.fn_args[0]] + self.fn_args[1:] return TypedFunc(composed_fn, fn_args=newargs, fn_type=newtype)
def __mul__(self, fn): """ (*) :: (b -> c) -> (a -> b) -> (a -> c) * is the function compose operator, equivalent to . in Haskell """ if not isinstance(fn, TypedFunc): return fn.__rmul__(self) env = {id(self): self.fn_type, id(fn): fn.fn_type} compose = Lam("arg", App(Var(id(self)), App(Var(id(fn)), Var("arg")))) newtype = analyze(compose, env) composed_fn = lambda x: self.func(fn.func(x)) newargs = [fn.fn_args[0]] + self.fn_args[1:] return TypedFunc(composed_fn, fn_args=newargs, fn_type=newtype)
def __call__(self, *args, **kwargs): # the environment contains the type of the function and the types # of the arguments env = {id(self):self.fn_type} env.update({id(arg):typeof(arg) for arg in args}) ap = Var(id(self)) for arg in args: if isinstance(arg, Undefined): return arg ap = App(ap, Var(id(arg))) result_type = analyze(ap, env) if len(self.fn_args) - 1 == len(args): result = self.func(*args) unify(result_type, typeof(result)) return result return TypedFunc(functools.partial(self.func, *args, **kwargs), self.fn_args[len(args):], result_type)
def __call__(self, *args, **kwargs): # the environment contains the type of the function and the types # of the arguments env = {id(self): self.fn_type} env.update({id(arg): typeof(arg) for arg in args}) ap = Var(id(self)) for arg in args: if isinstance(arg, Undefined): return arg ap = App(ap, Var(id(arg))) result_type = analyze(ap, env) if len(self.fn_args) - 1 == len(args): result = self.func(*args) unify(result_type, typeof(result)) return result return TypedFunc(functools.partial(self.func, *args, **kwargs), self.fn_args[len(args):], result_type)