LINUX.ORG.RU

Ambiguous occurrence в haskell

 


0

2

При решении задачки из учебника

data BinTree a = Leaf a | Branch (BinTree a) (BinTree a)

reverse :: BinTree a -> BinTree a
reverse (Leaf a) = Leaf a
reverse (Branch a b) = Branch (reverse b ) (reverse a )
-- reverse (Branch a b) = Branch (reverse  :: (BinTree a -> BinTree a) b ) (reverse :: (BinTree a -> BinTree a) a )
-- reverse (Branch a b) = Branch (reverse b :: (BinTree x)) (reverse a :: (BinTree x))

ghci при загрузке модуля, как бы я не пытался ему намекнуть типы, мне говорит одно и то же

Nat.hs:50:32:
    Ambiguous occurrence `reverse'
    It could refer to either `Nat.reverse', defined at Nat.hs:47:1
                          or `Prelude.reverse',
                             imported from `Prelude' at Nat.hs:1:8-10
                             (and originally defined in `GHC.List')

Nat.hs:50:59:
    Ambiguous occurrence `reverse'
    It could refer to either `Nat.reverse', defined at Nat.hs:47:1
                          or `Prelude.reverse',
                             imported from `Prelude' at Nat.hs:1:8-10
                             (and originally defined in `GHC.List')
Failed, modules loaded: none.

как с этим справится не отключая reverse из Prelude, а что бы была перегрузка функции?

Перемещено beastie из general


Две функции названы одинаково используй или квалифицированные импориы или спрячь один или полное имя вводи типа Nats.reverse

qnikst ★★★★★
()

Просто ты слишком много левых пакетов устанавливаешь) Лечится это тем, что ненужный пакет нужно разрегистрировать, чтобы он не находился.

Попробуй

ghc-pkg unregister [тут_имя_ненужного_пакета]
dave ★★★★★
()
Последнее исправление: dave (всего исправлений: 1)
Ответ на: комментарий от devsdc

Чуть с ума не сошёл, пока не понял, о чём речь.

«Функция класса» не звучит, простите. Плюс ко всему, в документации к GHC это таки называется методами.

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)

Хотя если это ты сам определил reverse, да еще хочешь перегрузить со стандартным, то так не получится.

Я почему-то сначала подумал, что какой-то левый пакет переопределил, и он у тебя виден, скажем, из emacs, что может мешать. Такая фигня иногда происходит, и тогда помогает упомянутая разрегистрация, но у тебя, похоже, совсем не тот случай.

dave ★★★★★
()

Никак. Нет в Haskell такого понятия как «перегрузка функции».

Miguel ★★★★★
()
Ответ на: комментарий от dave

ghc-pkg unregister [тут_имя_ненужного_пакета]

Так лучше вообще никогда не надо делать. 'ghc/ghci -hide-package=' или 'ghc/ghci -ignore-package=' делает то же самое без поломки базы зарегистрированных пакетов.

sf ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.