0

我正在编写一个图形库来了解更多关于在 Haskell 中构建稍微大一点的东西的信息,但我遇到了一个问题。

基本上,我试图将Edges 定义为一组两个点,一个from点和一个to点。但是,我有多种类型的边缘(加权/非加权),我不希望它们能够混入graphs。

所以,我的想法是创建几个新类,Weighted并且Edgy,为了能够实现我正在努力实现的多态行为的数量。两种类型Edge都是Edgy,但只有加权Edge类型是Weighted

这个Weighted类很简单,因为它只需要修改整个对象。这是它的样子:

class Weighted a where
  modifyWeight :: (Unbounded Int -> Unbounded Int) -> a -> a

Unbounded我拼凑在一起以支持无限大和小数字的 Num 类型在哪里。不过,这很简单,因为我只需要返回一个a.

我坚持的是让Edgy类返回类类型的类型(???不确定如何放置这个,内部类型,也许?)。为了使这一点更清楚,这就是我正在使用的东西,可能更有意义:

class Edgy a where
  to :: a -> Vertex a
  from :: a -> Vertex a

Vertex包装类在哪里——Edge我在这里尝试做的声明:

data Edge a = Edge (Vertex a) (Vertex a) deriving (Show, Eq)

data WEdge a = WEdge (Vertex a) (Vertex a) (Unbounded Int) deriving (Show, Eq)

所以,我真正想做的是说“好吧,如果你是Edgy班级的成员,你应该能够返回 aVertex类型的Edge”。

但是,GHC 不喜欢这样,因为ain 的类型Edgy最终是Edge a而不是a,而且我不确定如何让它“下降”到类中以将该类型拉出以返回它。

如果有任何不清楚的地方,请发表评论。

任何帮助是极大的赞赏; 我难住了!

谢谢!

4

1 回答 1

3

您可能想要使用类型构造函数类而不是类型类

class Edgy e where
    to :: e a -> Vertex a
    from :: e a -> Vertex a

instance Edgy Edge where ...
于 2012-12-13T16:59:56.880 回答