2016-08-12 3 views
-1

На многих языках существуют способы создать нечто вроде прозрачного прокси (или транспрокси) для выполнения RPC или даже вызова функций SQL. В C#, например, мы можем использовать метапрограммирование (используя IOC) или DLR для этого. Есть ли способ в Haskell создать прозрачный прокси? Предположим, у нас есть некоторые службы и после создания переменной прокси, мы должны быть в состоянии назвать «MyFunc», как показано ниже:Прозрачный прокси-сервер в Haskell

proxy myFunc arg1 arg2 

или любой другой аналогичный. Должен ли я использовать Template Haskell для этого?

+1

Если вы говорите, например, ['DynamicProxy'] (http://www.castleproject.org/projects/dynamicproxy/), то нет, у Haskell нет ничего такого же уродливого, как этот ужасный хак. Идеи, которые вы изучили на языке X, часто не применимы к языку Y, потому что язык Y имеет другой способ делать вещи. Итак, чего вы действительно пытаетесь достичь? –

+0

Я, конечно, знаю о различии в парадигме между языками, так как я серьезно работал с полдюжины языков. Я делаю то же самое с Python, используя __getattr__ и __call__ магические методы и в C#, используя объект IoC Proxy. Я знаю, что в Haskell нет подобного способа, но я имею в виду, есть ли альтернатива для реализации прозрачности клиента в Haskell? (За исключением полного генерации кода) – Kamyar

+0

Некоторое начальное обходное решение может определять тип класса для службы, а затем оператор для перевертывания первого аргумента функции, чтобы получившаяся обратная связь выглядела более красивой: 'x.> F = fx класс MyService где myFunc :: MyService -> a -> b -> Int result <- myServiceInstance.> myFunc arg1 arg2' – Kamyar

ответ

1

Самый простой способ - просто передать прокси как аргумент, а не наоборот. В большинстве случаев я просто делаю это, а прокси - только дескриптор соединения с базой данных. Вы также можете определить что-то например:

newtype Proxy = Proxy {withProxy :: (forall a . Proxiable a -> IO a)} 

Но я не думаю, что это действительно упростило бы что угодно.

+0

Это может не быть упростить, но, по крайней мере, украшает код! Спасибо, в любом случае! – Kamyar

Смежные вопросы