构建远程代码执行的功能抽象

时间:2018-05-12 08:05:58

标签: scala haskell functional-programming monads rpc

我目前正面临在我正在开发的功能架构中抽象远程方法调用(RMI / RPC)的问题。

我正在使用的编程语言是Scala,所以我并不局限于纯实现,但我想研究围绕通过网络连接执行代码的功能抽象的可能性和问题。

我在找什么

  • 通过远程函数调用抽象
  • 组合远程函数调用以形成服务器端的联合处理程序
  • <?php $equipment = array(); // Simulated post data from form submit $_POST["equipment"]["tables"] = "8' Tables"; $_POST["equipment"]["table_no"] = "6"; $_POST["equipment"]["chairs"] = "Chairs"; $_POST["equipment"]["chair_no"] = "6"; $_POST["equipment"]["round_tables"] = "Round Table"; $_POST["equipment"]["round_table_no"] = "6"; $_POST["equipment"]["piping_drapes"] = "Piping Drapes"; if ( isset($_POST['equipment']) ){ $equipment['tables'] = isset( $_POST['equipment']['tables'] ) ? str_replace("'","", $_POST['equipment']['tables']) : ''; $equipment['table_no'] = isset( $_POST['equipment']['table_no'] ) ? $_POST['equipment']['table_no'] : ''; $equipment['chairs'] = isset( $_POST['equipment']['chairs'] ) ? $_POST['equipment']['chairs'] : ''; $equipment['chair_no'] = isset( $_POST['equipment']['chair_no'] ) ? $_POST['equipment']['chair_no'] : ''; $equipment['round_tables'] = isset( $_POST['equipment']['round_tables'] ) ? $_POST['equipment']['round_tables'] : ''; $equipment['round_table_no'] = isset( $_POST['equipment']['round_table_no'] ) ? $_POST['equipment']['round_table_no'] : ''; } $equipment = json_encode($equipment); var_dump($equipment); // Encoded data as json string var_dump(json_decode($equipment, true)); // Associative array with the decoded data ?> 服务器端和客户端代理对象

我对这个问题的现有方法很感兴趣,可能在Haskell中。

可能的方法

由于到目前为止我还没有找到一个好的解决方案,我只能展示一些想法。

键入用于对字节流进行序列化和反序列化的类:

import urllib.request

服务器使用map/comap特征。处理程序被赋予trait RW[T] { def write(t: T, out: OutputStream): Unit def read(in: InputStream): T } ,它提供处理连接所需的服务器端信息(如DB访问)。处理连接可能会产生Handler类型的结果。

context

在客户端,呼叫看起来像普通功能。

R

现在想要用他们的逻辑来定义远程调用。这看起来像这样:

trait Handler[C, R]{
  def handle(c: Context, in: InputStream, out: OutputStream): R
}

trait RemoteCall[A, B]{ def call(a: A): B } 通过指定同时接受客户端数据case class CallDef[A: RW, B: RW, C, R](f: (A, C) => (B, R)) extends Handler[C, R] with RemoteCall[A, B] { … } 和服务器上下文CallDef的函数f来定义必须在服务器端运行的逻辑。它为客户端A生成答案,并为服务器C生成可用于更新服务器状态的结果。 类型BR必须是可序列化的。

这就是我的意思。一个重要的缺失部分是如何相互组合不同的A以形成联合处理程序,以及如何为类型添加更多功能,如仿函数和monad实例。因此,人们可以表达更复杂的计算,这些计算不仅包括单个远程调用。

问题

那么,您是否了解以类似功能方式处理远程调用的任何现有方法,可能来自Haskell?

您是否知道一种更简单的功能方法可以实现可比性?

0 个答案:

没有答案