【发布时间】:2016-08-12 21:09:46
【问题描述】:
在许多语言中,有一些方法可以创建称为透明代理(或 transproxy)的东西来执行 RPC 甚至调用 SQL 函数。例如,在 C# 中,我们都可以使用元编程(使用 IOC)或 DLR 来执行此操作。 Haskell 有什么方法可以创建透明代理吗?假设我们有一些服务,并且在创建代理变量之后,我们必须能够调用“myFunc”,如下所示:
proxy myFunc arg1 arg2
或任何类似的东西。我必须为此使用 Template Haskell 吗?
【问题讨论】:
-
如果你在谈论,例如,
DynamicProxy,那么不,Haskell 没有像那个可怕的黑客那样丑陋的东西。您在语言 X 中学到的想法通常不适用于语言 Y,因为语言 Y 有不同的做事方式。那么,您真正想要实现的目标是什么? -
我当然知道语言之间的范式差异,因为我认真研究过六种语言。我对 Python 使用 getattr 和 call 魔术方法以及在 C# 中使用 IoC 代理对象执行相同操作。我知道 Haskell 中没有类似的方法可以做到这一点,但我的意思是有没有其他方法可以在 Haskell 中实现客户端透明度? (除了完整的代码生成)
-
一些初始的解决方法可以是为服务定义一个类型类,然后定义一个运算符来翻转函数的第一个参数,以便生成的调用看起来更漂亮:
x .> f = f x class MyService where myFunc :: MyService -> a -> b -> Int result <- myServiceInstance .> myFunc arg1 arg2 -
如果你对 Haskell 有点熟悉,你就会知道它总是使副作用显式化。所以你永远不会在
IO之外调用网络服务或数据库... -
@mb21 我知道这就是为什么我使用 monad notaion 调用该服务的原因
标签: haskell metaprogramming rpc