2011-08-29 48 views
4

我必須做一個練習,我很迷茫......我需要爲Ord做一個多項式實例。這是我的嘗試:解決哈斯克爾方程

data Pol = P [(Float,Int)] deriving Show 

instance Ord Pol where 
    (Pol a) > (Pol b) = (maxGrado a) > (maxGrado b) || ((maxGrado a) == (maxGrado b) && (maxCoe a) > (maxCoe b)) 
    (Pol a) < (Pol b) = (maxGrado a) < (maxGrado b) || ((maxGrado a) == (maxGrado b) && (maxCoe a) < (maxCoe b)) 

maxGrado :: [(Float,Int)] -> Int 
maxGrado [] = 0 
maxGrado ((c,g):xs) = g 

maxCoe :: [(Float,Int)] -> Int 
maxCoe [] = 0 
maxcoe ((c,g):xs) = c 

--error:

ERROR file:.\Febrero 2011.hs:32 - Undefined data constructor "Pol" 

的錯誤是非常愚蠢的,但it's了一個小時試圖解決它...誰能幫助我?

謝謝!

+1

請不要低估 - 這個問題是絕對合法的。原來的形式 – fuz

+0

這個問題是不負責任的,不知道老帖子也讓我反感 - 但是我把它刪除了一切 – Carsten

+1

既然你說你「必須做一個練習」,我添加了「家庭作業」標籤。 –

回答

3

我想你想在你的實例函數中使用P而不是Pol。 Pol是類型,P是構造函數。

+0

是的,你是對的,但現在它給了我這個錯誤:錯誤文件:。\ Febrero 2011.hs:30 - 無法構建超類實例***實例:Ord Pol ***提供上下文:()** *必需的超類:Eq Pol – Sierra

9
data Pol = P [(Int, Int)] 

在此聲明,Pol是類型構造函數,P是此數據類型的唯一數據構造。一般來說,數據類型可以有多個數據構造函數,這就是爲什麼我們有這種區別。

一個簡單的規則是,無論何時談論類型,都應該使用類型構造函數,而在每次談論值時,都應該使用數據構造函數。

在這種情況下,您應該在實例頭中使用Pol,但在函數的模式中使用P

instance Ord Pol where 
    (P a) > (P b) = ... 
    (P a) < (P b) = ... 

還要注意的是類型構造函數和數據構造住在不同的命名空間,並且永遠不會在同一個環境中使用。這意味着他們可以擁有相同的名字。

data Pol = Pol [(Int, Int)] 

這也行得通。

+0

是的,你是對的,但現在它給了我這個錯誤:錯誤文件:。\ Febrero 2011.hs:30 - 無法構建超類實例 ***實例:Ord Pol ** *提供的上下文:() ***必需的超類:Eq Pol – Sierra

+0

@ user918139:'Eq'是'Ord'的超類,所以這意味着您還必須有一個'Eq'實例。在這種情況下,最簡單的事情就是告訴編譯器爲你派生它,就像你使用'Show':'data ...派生(Eq,Show)'所做的一樣。 – hammar

+0

太棒了,它的工作原理。非常感謝!! – Sierra