I did few tests to understand better generics syntax. This is a cool observation I made (Just for beginners like me who don't know it): If I write : func myfunc[T1, T2: uint8| int8](number1: T1, number2: T2): bool = Run
T1 is concerned by the constrain (uint8 | int8). It means that T1 too can only be an uint8 or an int8. To break that behavior (called type propagation), just replace the comma between T1 and T2 by a semicolon.