LINUX.ORG.RU

Ошибка «No instance», не смотря на то, что instance определен в подключаемом модуле

 


0

1

Решил забавы ради потыкать haskell'ем MPD. Поставил с hackage libmpd, но не могу скомпилировать код в три строки:

import Control.Monad.Error
import Network.MPD

main = withMPDEx "192.168.1.102" 6600 "" $ throwError noMsg

Здесь последним аргументом в withMPDEx передается монада MPD, у которой, судя по исходникам libmpd, определен instance MonadError MPDError

Интерпретатор выводит:

$ runhaskell MPDError.hs 

MPDError.hs:4:44:
    No instance for (MonadError e0 MPD)
      arising from a use of `throwError'
    Possible fix: add an instance declaration for (MonadError e0 MPD)
    In the second argument of `($)', namely `throwError noMsg'
    In the expression:
      withMPDEx "192.168.1.102" 6600 "" $ throwError noMsg
    In an equation for `main':
        main = withMPDEx "192.168.1.102" 6600 "" $ throwError noMsg

С явным указанием типов получаю более конкретную ошибку - «No instance for (MonadError MPDError MPD)»

Куда мог деться instance MonadError MPDError MPD, если я вижу использование того же throwError в исходниках libmpd?

Очень странно, но у меня

14:01 razor@localhost /home/razor/tmp/mpd % cabal-dev build    
Building mpd-0.1.0.0...
Preprocessing executable 'mpd' for mpd-0.1.0.0...
[1 of 1] Compiling Main             ( mpd.hs, dist/build/mpd/mpd-tmp/Main.o )
Linking dist/build/mpd/mpd ...
14:02 razor@localhost /home/razor/tmp/mpd % dist/build/mpd/mpd

То есть все собирается. Версии библиотек и компилятора в студию.

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

Все дефолтное от ubuntu

$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.4.2
$ cabal info libmpd
* libmpd           (library)
...
    Versions installed: 0.8.0.2
...

Это мой трехстрочник скомпилился? Действительно странно

tri10bit
() автор топика
Ответ на: комментарий от tri10bit

Тогда стоит проверить на самособранном libmpd 0.8.0.2

anonymous
()

Ладно, раз код по идее правильный - вечером еще покопаюсь, попробую разные варианты и если что получится - напишу

tri10bit
() автор топика

С явным указанием типов получаю более конкретную ошибку - «No instance for (MonadError MPDError MPD)»

Вероятно криво скомпиленный libmpd, ведь в исходниках:

{-# LANGUAGE ...GeneralizedNewtypeDeriving... #-}

newtype MPD a =
    MPD { runMPD :: ErrorT MPDError
                    (StateT MPDState
                     (ReaderT (Host, Port) IO)) a
        } deriving (... MonadError MPDError)
anonymous
()

Подложил исходники libmpd к своему файлику - компилится

Собрал теперь с `cabal build` libmpd - получил *.a файл (и hi, o)

Не соображу, как скомпилировать мой hs вместе с этой библиотекой

yk@yk-vostro:~/Develop/world/libmpd-0.8.0.2/dist/build$ ghc -c MPDError.hs

MPDError.hs:2:1:
    Bad interface file: ./Network/MPD.hi
        Something is amiss; requested module  main:Network.MPD differs from name found in the interface file libmpd-0.8.0.2:Network.MPD
tri10bit
() автор топика
Ответ на: комментарий от anonymous

Вероятно криво скомпиленный libmpd, ведь в исходниках:

Да, да я на этом участке с трансформерами разбирался и у меня тут тоже вопрос пока неразрешенный есть =)

tri10bit
() автор топика
Ответ на: комментарий от tri10bit

Собрал теперь с `cabal build` libmpd - получил *.a файл (и hi, o)

Дык, а локально устновить? Если мешается системный можно либо: 1) снести его, 2) от рута сделать ghc-pkg shadow, 3) установить как, например, libmpd-local (поправив cabal)

А лучше вообще сообрать свой deb-пакет и обновить.

anonymous
()

Да, забыл отписаться, на debian testing и experimental все работает (т.е. на более старых пакетах и более новых)

Причины я не выяснил, покопался в объектниках и интерфейсах, вроде похоже на правду и инстансы присутствуют.

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