【问题标题】:Transparent proxy in HaskellHaskell 中的透明代理
【发布时间】: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 使用 getattrcall 魔术方法以及在 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


【解决方案1】:

最简单的方法是将代理作为参数传递,而不是反过来(大多数时候我只是这样做,而代理只是数据库连接的句柄) 你也可以这样定义:

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

但我认为它不会真正简化任何事情。

【讨论】:

  • 可能不会简化,但至少美化了代码!还是谢谢!
猜你喜欢
  • 2011-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多