2015-05-03 2 views
0

Я пытаюсь использовать haskell-json-service. Когда я запускаю код, он выдает ошибку здесь:не может соответствовать типу 'ByteString o0 m0 Значение' Vs 'ByteString Data.Void.Void IO Value'

app req sendResponse = handle (sendResponse . invalidJson) $ do 
    value <- sourceRequestBody req $$ sinkParser json 
    newValue <- liftIO $ modValue value 
    sendResponse $ responseLBS 
     status200 
     [("Content-Type", "application/json")] 
     $ encode newValue 

Ошибка,

Couldn't match type ‘conduit-1.2.4:Data.Conduit.Internal.Conduit.ConduitM 
          ByteString o0 m0 Value’ 
        with ‘conduit-1.2.4.1:Data.Conduit.Internal.Conduit.ConduitM 
          ByteString Data.Void.Void IO Value’ 
NB: ‘conduit-1.2.4:Data.Conduit.Internal.Conduit.ConduitM’ 
      is defined in ‘Data.Conduit.Internal.Conduit’ 
       in package ‘conduit-1.2.4’ 
     ‘conduit-1.2.4.1:Data.Conduit.Internal.Conduit.ConduitM’ 
      is defined in ‘Data.Conduit.Internal.Conduit’ 
       in package ‘conduit-1.2.4.1’ 
Expected type: conduit-1.2.4.1:Data.Conduit.Internal.Conduit.Sink 
        ByteString IO Value 
     Actual type: conduit-1.2.4:Data.Conduit.Internal.Conduit.ConduitM 
        ByteString o0 m0 Value 
In the second argument of ‘($$)’, namely ‘sinkParser json’ 
    In a stmt of a 'do' block: 
     value <- sourceRequestBody req $$ sinkParser json 

Что double dollar делать? А что это за тип - ByteString o0 m0 Value?

+0

'$$' является оператором соединения кабелепровода. – Sibi

ответ

3

Это, как представляется, проблема:

conduit-1.2.4:... 
conduit-1.2.4.1:... 

Ваш код использует ByteString типа из двух различных версий conduit библиотеки. С точки зрения GHC эти два типа не связаны: например, вы не можете передать первый тип библиотечной функции, которая ожидает вторую.

Причиной этого может быть использование библиотеки X, которая была скомпилирована против «старого» conduit и библиотеки Y, которая вместо этого была скомпилирована против более новой версии. Если ваша программа импортирует X и Y, у вас появятся проблемы при прохождении байтов от X до Y или наоборот. Я понятия не имею, что такое X или Y.

Возможно, вы можете перекомпилировать X или Y, чтобы они использовали ту же версию conduit.

+0

Я выполнил команду ghc-pkg find-module Data.Conduit', чтобы проверить мои локальные установки. Выход: '/opt/ghc/7.8.4/lib/ghc-7.8.4/package.conf.d /home/sk/.ghc/x86_64-linux-7.8.4/package.conf.d труба-1.2.4 труба-1.2.4.1'. Похоже, что Data.Conduit' является частью встроенных библиотек haskell (так как он находится внутри /opt/ghc/7.8.4/lib/.....), а в моих пользовательских библиотеках также содержится пакет Data.Conduit , –

+1

Нет, бит, следующий за '/ opt/ghc/..', пуст, поэтому нет глобального канала (это немного запутывает!). Если вы сделаете 'ghc-pkg unregister conduit-1.2.4', он предупредит вас, что сломается. Вы должны, вероятно, отменить регистрацию этих вещей, а затем кабелепровод-1.2.4. Вы можете пойти глубже и отменить все, что зависит от нового канала. – Michael

Смежные вопросы