我正在编写一个图形库来了解更多关于在 Haskell 中构建稍微大一点的东西的信息,但我遇到了一个问题。
基本上,我试图将Edge
s 定义为一组两个点,一个from
点和一个to
点。但是,我有多种类型的边缘(加权/非加权),我不希望它们能够混入graph
s。
所以,我的想法是创建几个新类,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 不喜欢这样,因为a
in 的类型Edgy
最终是Edge a
而不是a
,而且我不确定如何让它“下降”到类中以将该类型拉出以返回它。
如果有任何不清楚的地方,请发表评论。
任何帮助是极大的赞赏; 我难住了!
谢谢!