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,它只是将两个静态值混为一谈.然而,StaticLabel并StaticPtr似乎以实现不同的方式相同的目标.
如果我们继续使用,StaticLabel我们只需要/转换一个String标签,然后可以用来查找以下Dynamic值RemoteTable:
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,如果目标TypeRep是
instanceOf
在的TypeRep,我们店SDynamic或Dynamic.
远程表的管理,虽然在某种程度上通过TH自动化,仍然有点烦人,所以为什么不使用StaticPtrs?是否StaticLabel
只是为了与旧的GHC向后兼容或我遗漏了什么?
这样做的主要原因之一是我们必须向后兼容并支持 3 个主要版本的 GHC。我们是否想立即跳入静态指针解决方案也并不明显。比如他们的“稳定性”较弱。基本上唯一的保证是对于相同版本的编译器、库和相同的源代码 - 静态指针将被编译为相同的值。实际上,分布式进程的定义就是考虑到这一点,但有些人希望拥有更稳定的指针和静态标签,因为您可以为标签定义自己的规则,并且即使在不同的可执行文件中也可以使用相同的标签。
如果静态指针的保证对您来说足够了,那么有分布式闭包包,它提供基于静态指针的函数引用。使用这个包,您根本不需要使用 Remotetable,只需将其保留用于分布式进程内部和向后兼容性。
| 归档时间: |
|
| 查看次数: |
127 次 |
| 最近记录: |