Haskell多个函子

时间:2011-04-01 00:01:54

标签: haskell monads functor

我在Haskell中创建了一个fibonacci堆实现,我不确定干净的方法是什么。

例如,我想订购节点。所以我可以这样做:

instance Ord (FibNode e) where
  f1 `compare` f2 = (key f1) `compare` (key f2)

如果我将FibNode作为monad,这将更容易完成。但有时我想折叠节点的兄弟姐妹,或折叠他们的孩子等等。因此定义一个f x = f $ key x不会一直工作的仿函数。

除了定义我自己的fmapKeyfmapSibsfmapKids ...有没有办法做到这一点?

2 个答案:

答案 0 :(得分:2)

您不能以多种方式将类型构造函数作为Functor的实例。 但是你可以在你的类型周围创建各种newtype包装器,每个包装器都有自己的Functor实例。但这并不比定义自己的fmap函数更方便。

答案 1 :(得分:1)

(Fibonacci)堆是一个具有specific asymptotic runtime guarantees for various operations on it的固有不纯,破坏性更新的数据结构。如果你能通过直接翻译成纯版本来保持这些保证,我会感到惊讶。我的建议是使用ST或IO数组之类的东西使其成为不纯的数据结构。这样可以更直接地实现经典算法。