我目前正面临在我正在开发的功能架构中抽象远程方法调用(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
生成可用于更新服务器状态的结果。
类型B
和R
必须是可序列化的。
这就是我的意思。一个重要的缺失部分是如何相互组合不同的A
以形成联合处理程序,以及如何为类型添加更多功能,如仿函数和monad实例。因此,人们可以表达更复杂的计算,这些计算不仅包括单个远程调用。
那么,您是否了解以类似功能方式处理远程调用的任何现有方法,可能来自Haskell?
您是否知道一种更简单的功能方法可以实现可比性?