I'm not sure what the intended semantics of the function type you're describing are, but you have the syntax of _fun incorrect. The type of f needs to needs to be specified like this: (f : <type here>) and there's no use of ::.
The argument names (eg, f) are not in scope in the type expressions. It would be strange for the calling convention of a function to change depending on the actual values passed to it. The _fun syntax is syntactic sugar for _cprocedure, which just takes a list of input types.
I believe _array/list is mainly for use within define-cstruct. For function calls, C passes an array argument as a pointer, so you probably just want to use _list instead, as in (_list i _int).