【发布时间】:2016-07-19 15:29:41
【问题描述】:
我正在尝试为图形编写一个类型类。基本上,类型类看起来像:
class Graph g where
adjacentNodes :: g n -> n -> [n]
其中我使用n来表示节点的类型。
然后我有以下Graph 定义如下:
data FiniteGraph n = FiniteGraph { runFiniteGraph :: Array n [n] }
其中Array取自标准容器Data.Array,其结构是表示一个有限图,以将每个节点映射到其相邻节点的方式。
问题来了,当我尝试将FiniteGraph 设为Graph 的实例时。
instance Graph FiniteGraph where
adjacentNodes g n = (runFiniteGraph g) ! n
不幸的是,这不起作用,因为! 运算符需要约束Ix n,但我找不到在哪里声明它。
我希望实例声明类似于:
instance (Ix n) => Graph (FiniteGraph n) where { ... }
但这要求class Graph g 中的g 具有* 而不是* -> *,这样我就无法证明n 依赖于g。
那我能用它做什么呢?谢谢。
【问题讨论】:
标签: haskell graph polymorphism typeclass type-theory