2012-11-24 41 views
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 [[]] 

當我打電話的空,我得到一個模棱兩可的錯誤類型

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

爲什麼會出現這個錯誤?我該如何解決它?

+0

...和你的問題是什麼? – melpomene

+3

向我們顯示包含「空」的代碼,併爲您提供類型錯誤。如果你自己輸入'empty'到ghci中,你必須給它一個類型註釋,例如'empty :: MxGraph Int Int'。 – dave4420

+0

我只是說空着,編輯我的問題 –

回答

2

您看到此類型錯誤,因爲Haskell沒有提供足夠的信息來知道空的類型。

任何試圖評估表達式的嘗試都需要類型。該類型尚未定義,因爲該實例尚未被選中。也就是說,如函數依賴關係所述,只有在類型參數g已知時才能選擇實例。簡單來說,它並不是已知的,因爲您沒有以任何方式指定它(例如使用類型註釋)。

類型系統使得開放的世界假設。這意味着類型類可能會有很多實例,因此類型系統在選擇實例時比較保守(即使當前只有一個實例對您有意義,但可能會有更多其他日子,系統不想僅僅因爲其他一些實例進入範圍而改變主意)。

+3

你可以添加幾個分段符?這會使它更具可讀性。 –

+0

建議添加註釋。 – rlaemmel