2012-05-18 33 views
1

注意:因爲我的無線網卡在我的電腦上壞掉了,所以可能會出現一些拼寫錯誤(大寫字母等),所以我不能在這個電腦上安裝haskell,代碼(我沒有記憶棒XD)約束中含糊不清的類型變量`f0':Haskell

我一直在使用
Config line values 2 2 定義配置,但我只是不喜歡這個功能「開始」。凡是需要一個F - >˚F工作正常,但...

data Config = Config { 
        line :: Line, 
        nums :: [Nums], 
        indent :: Indent, 
         run :: Run 
} deriving (Eq, Show) 

class (Result f) => Test f where 
      start :: Line -> [Nums] -> f 

instance Test Config where 
     start line nums = Config line nums 0 0 

如果我運行

> start 2 [0,0,0] 

應返回

> Config 2 [0,0,0] 0 0 

我得到的錯誤:

Ambiguous type variable `f0' in the constraint: 
    (Test f0) arising from a use of `start' 
Probable fix: add a type signature that fixes these type variable(s) 

正在運行

> :t Config 2 [0,0,0] 0 0 

給出

> Config 2 [0,0,0] 0 0 :: Config 

這是正確的

+0

你正在使用什麼'Test'類? –

+0

你能告訴我們在什麼情況下你會得到錯誤嗎? –

+0

如果我運行>開始2 [0,0,0,0] –

回答

4

好,只是有消息說什麼,

start 2 [0,0,0] 

可以任何類型是Test一個實例。編譯器有查不到沒有你告訴它的方式,無論是直接與類型簽名,

> start 2 [0,0,0] :: Config 

應該沒有問題的工作,或通過提供上下文從中型可以推斷,

> indent $ start 2 [0,0,0] 

也應該起作用,因爲現在可以使用start的結果indent的類型來推斷該類型。

您可能預計編譯器選擇Config類型,因爲此刻這是Test的唯一實例。但編譯器從不選擇一個實例,因爲沒有其他實例知道它,因爲當其他實例添加到不同模塊中時,這會破壞代碼。

1

的問題是,作爲構建,表達start 2 [0,0,0,0]可以返回屬於Test類任何類型。在這種情況下,系統無法返回Config。如果你明確地施加它,即

start 2 [0,0,0] :: Config 

應該工作。