How to specify "void" type with type params


What should I specify as a type parameter in example #2 for it to work?

Also, it is not entirely clear for me why () -> () and () -> (()) are different types and are not compatible with each other.

I’ll answer here. Functions accept and return sequences of arguments. A binary function has a type (T1, T2) -> .... A nullary function (accepting no arguments) has type () -> ....
So far everything is standard.
When there is one input, then there is a twist. Assuming T1 is not syntactically a tuple type, T1 -> ... and (T1) -> ... are equivalent. This is because there are no one-tuples in Motoko. But if you have (()) -> ... then this is a function that receives a unit (i.e. a single value of type ()). Similarly, ((T1, T2)) -> ... is a function type receiving a single argument of type (T1, T2), i.e. a pair.

Same rules apply to the returned values side.