为什么在CloudHaskell中仍然使用远程表和StaticLabel?

Mar*_*ark 5 haskell cloud-haskell

我正在阅读distributed-process相关软件包的源代码.在distributed-static我们的定义StaticLabel:

data StaticLabel =
    StaticLabel String
  | StaticApply !StaticLabel !StaticLabel
  | StaticPtr SDynamic
  deriving (Eq, Ord, Typeable, Show)
Run Code Online (Sandbox Code Playgroud)

然后将其定义Static为newtype包装器 StaticLabel,附加了一个用于类型安全的幻像变量:

newtype Static a = Static StaticLabel
  deriving (Eq, Ord, Typeable, Show)
Run Code Online (Sandbox Code Playgroud)

我没有任何问题StaticApply,它只是将两个静态值混为一谈.然而,StaticLabelStaticPtr似乎以实现不同的方式相同的目标.

如果我们继续使用,StaticLabel我们只需要/转换一个String标签,然后可以用来查找以下DynamicRemoteTable:

newtype RemoteTable = RemoteTable (Map String Dynamic)
Run Code Online (Sandbox Code Playgroud)

在哪里Dynamic(定义rank1dynamic):

data Dynamic = Dynamic TypeRep GHC.Any
Run Code Online (Sandbox Code Playgroud)

作为几乎是一样SDynamic包含在StaticPtr:

data SDynamic = SDynamic TypeRep (StaticPtr GHC.Any)
Run Code Online (Sandbox Code Playgroud)

不同之处在于,Dynamic我们GHC.Any没有间接,SDynamic我们必须查找价值.其结果是一样的:我们收到的Any价值,我们可以unsafeCoerce,如果目标TypeRepinstanceOf 在的TypeRep,我们店SDynamicDynamic.

远程表的管理,虽然在某种程度上通过TH自动化,仍然有点烦人,所以为什么不使用StaticPtrs?是否StaticLabel 只是为了与旧的GHC向后兼容或我遗漏了什么?

qni*_*kst 1

这样做的主要原因之一是我们必须向后兼容并支持 3 个主要版本的 GHC。我们是否想立即跳入静态指针解决方案也并不明显。比如他们的“稳定性”较弱。基本上唯一的保证是对于相同版本的编译器、库和相同的源代码 - 静态指针将被编译为相同的值。实际上,分布式进程的定义就是考虑到这一点,但有些人希望拥有更稳定的指针和静态标签,因为您可以为标签定义自己的规则,并且即使在不同的可执行文件中也可以使用相同的标签。

如果静态指针的保证对您来说足够了,那么有分布式闭包包,它提供基于静态指针的函数引用。使用这个包,您根本不需要使用 Remotetable,只需将其保留用于分布式进程内部和向后兼容性。