2014-03-02 139 views
1

有人可以向我解釋這段代碼的作用(主要是最後兩行)嗎?我應該不能將Nothing傳遞給defValue嗎?我試着和得到一個錯誤「沒有實例從使用而產生的(DEF,A0)‘利用DefValue’」Haskell中的懶惰模式

class Def a where 
    defValue :: a -> a 

instance Def a => Def (Maybe a) where 
    defValue ~(Just x) = Just (defValue x) 
+0

您可能需要另一種模式,例如defValue〜(Nothing)=無。我懷疑Nothing模式與Just x匹配。 – rickythesk8r

+1

你使用的代碼在哪裏?編譯器不應該能夠推斷'Def(也許a)',如果它不知道'a'的任何內容,這可能是你爲什麼得到這個錯誤。另外,你確定一個無可辯駁的模式真的是你應該在這裏做的嗎?即使它通過了類型檢查,傳遞「Nothing」也會導致異常。 – Cubic

+0

@ rickythesk8r我試過defValue〜(Nothing)=沒有,那沒用。我運行defValue Nothing。也許我錯過了什麼? –

回答

3

這個問題有沒有關係模式,其實你會得到同樣的錯誤信息如果你宣佈

instance Def a => Def (Maybe a) where 
    defValue = undefined 

事實上,你的代碼應該工作(只要它可能可以,但是我會說你的整個想法是不好的,而不需要非常不安全的),但使用那個Maybe實例,你需要一個打包類型的實例來處理。舉例來說,如果你添加

instance Def Int where 
    defValue _ = 0 

那麼你可以做

DefVals>利用DefValue(僅有1 ::也許智力)
只需0
DefVals>利用DefValue(沒有::也許智力)
只需0

+1

爲什麼不像'def'那樣做(並且就此而言「有界」)。 '類Def Defan defValue :: a'其中一個實例將'defValue =只是defValue'? –