Haskell不明确类型错误

Haskell不明确类型错误,haskell,Haskell,我有以下定义 {-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances, FlexibleContexts #-} import qualified Data.Map as M class Graph g n e | g -> n e where empty :: g -- returns an

我有以下定义

{-# 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 [[]]
当我尝试调用empty时,我得到一个不明确的类型错误

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

为什么会出现这个错误?如何修复它?

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

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


类型类系统提出了一个开放世界的假设。这意味着有问题的类型类可能有多个实例,因此类型系统在选择实例时是保守的(即使当前只有一个实例对您有意义,但以后可能会有更多实例,并且系统不想因为其他实例进入范围而改变主意).

。。。您的问题是什么?向我们展示您的代码,其中包含
,并给出类型错误。如果你自己在ghci中键入
empty
,你必须给它一个类型注释,例如
empty::MxGraph Int Int
。我只是说空的,编辑过的我的问题你能添加一些段落分隔符吗?这将使它更具可读性。根据建议添加评论。