You might declare ``op`` as ``Callable`` instead of ``Function``. ``Callable`` is a union of both ``Function`` and ``DataType``. By allowing type constructor for ``op``, it makes it possible to construct recursive data-structure, which is sometimes useful.