0

私は次の定義を持っています

{-# 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: ...

なぜこのエラーが発生するのですか? どうすれば修正できますか?

4

1 に答える 1

2

Haskell には空の型を知るための十分な情報が提供されていないため、この型エラーが表示されます。

ただし、式を評価しようとすると、型が必要になります。インスタンスをまだ選択できないため、タイプはまだ定義されていません。つまり、関数の依存関係が示すように、型パラメーター g がわかっている場合にのみインスタンスを選択できます。簡単に言えば、(型注釈などで) 指定していないため、わかりません。

型クラス システムは、オープン ワールドの仮定を行います。これは、問題の型クラスに多くのインスタンスが存在する可能性があることを意味し、したがって、型システムはインスタンスの選択において保守的です (現在、意味のあるインスタンスが 1 つしかない場合でも、別の日にはさらに多くのインスタンスが存在する可能性があります)。システムは、他のインスタンスがスコープに入ったという理由だけで考えを変えたくありません)。

于 2012-11-24T23:32:48.833 に答える