Es posible emular una función usando su propio tipo de datos?

¿Es posible emular una función con su propio tipo de datos con alguna extensión de GHC? Lo que quiero hacer es, por ejemplo,

(sintaxis imaginaria)

data MyFunc = MyFunc String (Int->Int)

instance (Int->Int) MyFunc where
    ($) (MyFunc _ f) i = f i

inc = MyFunc "increment" (1+)

test = inc 1

Es decir. datos que llevan cierta metainformación y pueden coincidir con patrones, pero que aún pueden llamarse como una función normal. Ahora, sé que podría definir mi propio operador infijo como$$ y llamainc $$ 1, pero poder usar la sintaxis de llamada de función regular sería muy útil en DSL incrustados.

Respuestas a la pregunta(3)

Su respuesta a la pregunta