静态指针的二进制实例

Binary instance for Static Pointers

我有以下数据类型

data Foo a b = A (StaticPtr (a -> b)) deriving (Generic, Typeable)

我想为此类型生成 Binary 实例,以便我可以在远程节点上使用此函数。

但是,使用自动二进制实例化在这里不起作用:

instance (Binary a, Binary b) => Binary (Foo a b)

这导致

• Could not deduce (Binary (StaticPtr (a -> b)))
    arising from a use of ‘binary-0.8.5.1:Data.Binary.Class.$dmput’
  from the context: (Binary a, Binary b)
    bound by the instance declaration
    at /Users/abhiroop/Haskell/snape/app/Spec.hs:23:10-49
• In the expression:
    binary-0.8.5.1:Data.Binary.Class.$dmput @Foo a b
  In an equation for ‘binary-0.8.5.1:Data.Binary.Class.put’:
      binary-0.8.5.1:Data.Binary.Class.put
        = binary-0.8.5.1:Data.Binary.Class.$dmput @Foo a b
  In the instance declaration for ‘Binary (Foo a b)’


• Could not deduce (Binary (StaticPtr (a -> b)))
    arising from a use of ‘binary-0.8.5.1:Data.Binary.Class.$dmget’
  from the context: (Binary a, Binary b)
    bound by the instance declaration
    at /Users/abhiroop/Haskell/snape/app/Spec.hs:23:10-49
• In the expression:
    binary-0.8.5.1:Data.Binary.Class.$dmget @Foo a b
  In an equation for ‘binary-0.8.5.1:Data.Binary.Class.get’:
      binary-0.8.5.1:Data.Binary.Class.get
        = binary-0.8.5.1:Data.Binary.Class.$dmget @Foo a b
  In the instance declaration for ‘Binary (Foo a b)’

如何在此处自动生成 Binary 实例?

您可以通过 staticKeyStaticPtr 序列化为 Fingerprint,并通过其下方的 unsafeLookupStaticPtr 将其反序列化。

您不能为 StaticPtr 定义一个 Binary 实例(即使您将它包装在一个新类型中以避免孤儿),因为不能纯粹地进行查找。但是您仍然可以将序列化器和反序列化器定义和使用为常规的非重载函数。

夏丽瑶的回答是正确的。但总的来说,我必须更改我的数据类型才能远程传递它们。我在这里写我的更改,所以如果有人想远程发送函数,它可能会有用,网上没有太多资源。

所以不用

data Foo a b = A (StaticPtr (a -> b))

我已将我的数据类型更改为如下所示:

data Foo a b = A (a -> b)

或简化

data Foo f = A f

这里f是我要远程发送的功能

所以举一个像 (+ 1) 这样的函数的简单例子,想象一下我想把它映射到远程存在的列表 [1,2,3] 上。我的代码变成这样:

main :: IO [Int]
main = do
let list = [1,2,3]
    a = static (A (+ 1)) :: StaticPtr (Foo (Int -> Int))
    t = staticKey a
    -- assuming you sent t to the remote node
    -- code on the remote node
    x <- unsafeLookupStaticPtr t
    case x of
      Just sptr -> case deRefStaticPtr sptr of
                         A f -> return $ map f list
                         _   -> error "Task undefined"
      Nothing -> error "Wrong function serialized"