首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell二义性类型错误

Haskell二义性类型错误
EN

Stack Overflow用户
提问于 2012-11-25 07:14:30
回答 1查看 153关注 0票数 0

我有以下定义

代码语言:javascript
复制
{-# 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时,我得到了一个不明确的类型错误

代码语言:javascript
复制
*Main> empty
Ambiguous type variables `g0', `n0', `e0' in the constraint: ...

为什么会出现这个错误?我怎么才能修复它?

EN

回答 1

Stack Overflow用户

发布于 2012-11-25 07:32:49

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

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

type-class系统做了一个开放世界的假设。这意味着对于所讨论的类型类,可能有许多实例,因此类型系统在选择实例时是保守的(即使当前只有一个实例对您有意义,但将来可能会有更多实例,系统不想因为其他实例进入作用域而改变主意)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13546621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档