from ltypes import TypeVar, restriction, i32, f32 from numpy import empty n: i32 n = TypeVar("n") m: i32 m = TypeVar("m") T = TypeVar('T') @restriction def add(x: T, y: T) -> T: pass def add_integer(x: i32, y: i32) -> i32: return x + y def add_float(x: f32, y: f32) -> f32: return x + y def g(n: i32, m: i32, a: T[n,m], b: T[n,m], **kwargs) -> T[n,m]: r: T[n,m] r = empty([n,m]) i: i32 j: i32 for i in range(n): for j in range(m): r[i,j] = add(a[i,j],b[i,j]) print(r[0,0]) def main(): a_int: i32[1,1] = empty([1,1]) a_int[0,0] = 400 b_int: i32[1,1] = empty([1,1]) b_int[0,0] = 20 g(1, 1, a_int, b_int, add=add_integer) a_float: f32[1,1] = empty([1,1]) a_float[0,0] = f32(400) b_float: f32[1,1] = empty([1,1]) b_float[0,0] = f32(20) g(1, 1, a_float, b_float, add=add_float) main()