我有以下定义
{-# 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: ...为什么会出现这个错误?我怎么才能修复它?
发布于 2012-11-25 07:32:49
您会看到此类型错误,因为Haskell没有提供足够的信息来了解empty的类型。
但是,任何对表达式求值的尝试都需要类型。尚未定义该类型,因为还无法选择该实例。也就是说,正如函数依赖所说,只有在类型参数g已知的情况下才能选择实例。简单地说,它是未知的,因为您没有以任何方式指定它(例如使用类型注释)。
type-class系统做了一个开放世界的假设。这意味着对于所讨论的类型类,可能有许多实例,因此类型系统在选择实例时是保守的(即使当前只有一个实例对您有意义,但将来可能会有更多实例,系统不想因为其他实例进入作用域而改变主意)。
https://stackoverflow.com/questions/13546621
复制相似问题