我在这里做错什么了?我猜想类型变量a不受mkgraph类型签名的约束,但是mkgraph的定义是否应该强制节点和边签名中的a与a相同?
你猜对了;另一个
a
是一个新类型变量。这意味着,它不仅不一样
一
如在
mkGraph
的签名,是全新的
普遍量化
类型变量,不正确。调用的类型
一
因此,在您的内部签名既不是多态的,也不是单一的已知类型。不,它“不应该”,按照哈斯克尔的标准。在Haskell98中,实际上不可能为
nodes
和
edges
在你的代码中。是的,有点傻。
然而,GHC提供了
ScopedTypeVariables
extension
这就允许了这一点。GHC用户指南的相关章节还讨论了上述“不可能的类型签名”问题。
注意,您还需要添加一个显式
forall
在的类型签名中
mkgraph图
,即,
forall a. (Ord a) => [(a,a)] -> Graph a
使类型变量进入范围。启用扩展并添加
福尔
让您的代码类型为我检查。