我有以下定义
{-# 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: ...
为什么会出现此错误?我该如何解决?
答案 0 :(得分:2)
您看到此类型错误,因为Haskell没有提供足够的信息来了解空类型。
任何评估表达式的尝试都需要类型。尚未定义类型,因为尚未选择实例。也就是说,正如功能依赖性所述,只有在已知类型参数g的情况下才能选择实例。简单地说,它是未知的,因为您没有以任何方式指定它(例如使用类型注释)。
类型级系统是一个开放的世界假设。这意味着有问题的类型类可能有很多实例,因此类型系统在选择实例时是保守的(即使目前只有一个对你有意义的实例,但是其他一天可能会有更多的实例和系统不想因为其他一些实例进入范围而改变主意。