Можно ли эмулировать функцию с использованием вашего собственного типа данных?

Можно ли сымитировать функцию с вашим собственным типом данных с некоторым расширением GHC? Я хочу, например,

(воображаемый синтаксис)

data MyFunc = MyFunc String (Int->Int)

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

inc = MyFunc "increment" (1+)

test = inc 1

Т.е. данные, которые несут с собой некоторую метаинформацию и могут быть сопоставлены с шаблоном, но при этом могут вызываться как обычная функция. Теперь я знаю, что могу определить свой собственный инфиксный оператор, например $$ , и вызвать inc $$ 1 , но возможность использовать обычный синтаксис вызова функции была бы очень полезна во встроенных DSL.

11
задан shang 26 June 2011 в 10:16
поделиться