Ошибка: неоднозначное вхождение класса "Ord" - PullRequest
0 голосов
/ 08 ноября 2010
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])

как я могу исправить эту ошибку -> Неоднозначное вхождение класса "Ord" * Может относиться к: Hugs.Prelude.Ord

Ответы [ 2 ]

3 голосов
/ 08 ноября 2010

Я не могу воспроизвести эту ошибку, но могу предположить. Ошибка «Неоднозначное вхождение класса» означает, что существует несколько определений «Ord» в области видимости, поэтому реальная проблема не в коде, который вы включили здесь. Проблема либо в том, что один из импортируемых вами модулей по какой-то причине переопределяет «Ord», либо в вашем коде. В любом случае, единственный способ, который может работать, - это если другие определения (например, определение по умолчанию в Prelude) являются скрытыми или квалифицированными. Если вы пытаетесь использовать нестандартную реализацию Ord, вам нужно импортировать Orlude, скрывающий Prelude:

import Prelude hiding(Ord)

Если вы намеренно не используете нестандартный Орд, вам нужно выяснить, откуда взялся второй, и удалить или скрыть его. Однако в вашем вопросе недостаточно информации, чтобы я мог сказать, как это сделать. Я ожидаю, что сообщение об ошибке также будет длиннее, чем то, что вы перечислили здесь, так как оно должно показывать расположение обоих определений Ord.

1 голос
/ 08 ноября 2010

Что произойдет, если вы удалите контекст Ord из объявления данных?

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

Контексты классов в объявлениях данных довольно неинтуитивны, и я подозреваю, что это может вызывать ошибку Хагса.

В любом случае не следует помещать контексты в объявления данных или новых типов. Они полезны с некоторыми расширениями GHC, но я не думаю, что Хагс поддерживает ни один из этих случаев.

...