0

我有以下定义

{-# LANGUAGE MultiParamTypeClasses,
             FunctionalDependencies,
             FlexibleInstances,
             FlexibleContexts #-}

import qualified Data.Map as M

class Graph g n e | g -> n e where
      empty :: g    -- returns an empty graph

type Matrix a = [[a]]
data MxGraph a b = MxGraph { nodeMap :: M.Map a Int, edgeMatrix :: Matrix (Maybe b) } deriving Show

instance (Ord n) => Graph (MxGraph n e) n e where
         empty = MxGraph M.empty [[]]

当我尝试调用空时,我得到一个模棱两可的类型错误

*Main> empty
Ambiguous type variables `g0', `n0', `e0' in the constraint: ...

为什么我会收到此错误?我该如何解决?

4

1 回答 1

2

您看到此类型错误是因为没有为 Haskell 提供足够的信息来了解空的类型。

任何评估表达式的尝试都需要类型。尚未定义类型,因为尚无法选择实例。也就是说,正如函数依赖所说,只有在类型参数 g 已知的情况下才能选择实例。简单地说,它是未知的,因为您没有以任何方式指定它(例如使用类型注释)。

类型类系统做了一个开放世界的假设。这意味着所讨论的类型类可能有很多实例,因此类型系统在选择实例时是保守的(即使目前只有一个实例对您有意义,但其他日子可能会更多,并且系统不想仅仅因为其他一些实例进入范围而改变主意)。

于 2012-11-24T23:32:48.833 回答