2010-11-08 30 views
0
data (Ord a) => Stree a = Null 
| Fork (Stree a) a (Stree a) 

mkStree :: (Ord a) => [a] -> Stree a 
mkStree [] = Null 
mkStree (x:xs) = Fork (mkStree smaller) x (mkStree larger) 
       where (smaller,larger) = partition (<= x) xs      
partition :: (a->Bool) -> [a] -> ([a],[a]) 
partition p xs = ([ x | x <- xs, p x], 
        [ y | y <- xs, (not . p) y]) 

如何解決這種故障 - >曖昧類出現「奧德」 *可以參考:Hugs.Prelude.Ord錯誤:不明確的類出現「奧德」

+0

哪條線給你這個錯誤?數據行? 'mkStree'行?都? – dave4420 2010-11-08 15:25:02

+0

此代碼似乎沒有任何類型錯誤。 – 2011-05-02 21:27:25

回答

3

我不能重現此錯誤,但我可以採取一些猜測。 「不明確的類發生」錯誤意味着在範圍中有多個「Ord」的定義,所以真正的問題不在這裏包含的代碼中。問題在於,您導入的某個模塊出於某種原因重新定義了「Ord」,或者您正在代碼中重新定義它。無論哪種方式,唯一可行的方法是其他定義(如Prelude中的默認定義)是隱藏的還是合格的。如果你想使用一個非標準的奧德實現,你需要導入的前奏隱藏奧德:如果你不是故意使用非標準奧德

import Prelude hiding(Ord) 

,那麼你就需要找出第二個來自哪裏並將其移除或隱藏。儘管如此,您的問題中沒有足夠的信息讓我能夠說出如何去做。我希望錯誤信息也比你在這裏列出的要長,因爲它應該顯示Ord的兩個定義的位置。

1

如果從數據聲明中刪除Ord上下文會發生什麼?

data Stree a = Null | Fork (Stree a) a (Stree a) 

關於數據聲明的類上下文非常不直觀,我懷疑這可能會導致Hugs出錯。

在任何情況下,您都不應該將數據或新類型聲明放在上下文中。他們對某些GHC擴展很有用,但我不認爲Hugs支持任何這些情況。

+1

在即將發佈的haskell-prime版本中,還有強烈的情緒去除數據刪除的類上下文。 – sclv 2010-11-08 17:29:31

+0

就我個人而言,我希望看到它們正式更改爲GHC的開發人員針對GADT構造函數(其中上下文需要構造並通過模式匹配重新引入)的類上下文的語義。 – mokus 2010-11-09 13:39:56