Jeremy Knees
Jeremy Knees

Reputation: 662

Haskell Ambiguous type error

I have the following definitions

{-# 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 [[]]

When I try to call empty I get an ambiguous type error

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

Why do I get this error? How can I fix it?

Upvotes: 0

Views: 167

Answers (1)

rlaemmel
rlaemmel

Reputation: 21

You are seeing this type error because Haskell is not provided with sufficient information to know the type of empty.

Any attempt to evaluate an expression though requires the type. The type is not defined yet because the instance cannot be selected yet. That is, as the functional dependency says, the instance can only be selected if type parameter g is known. Simply, it is not known because you do not specify it in any way (such as with a type annotation).

The type-class system makes an open world assumption. This means that there could be many instances for the type class in question and hence the type system is conservative in selecting an instance (even if currently there is only one instance that makes sense to you, but there could be more some other day and the system doesn't want to change its mind just because some other instances get into scope).

Upvotes: 2

Related Questions