user2879704
user2879704

Reputation:

couldn't match type 'ByteString o0 m0 Value' Vs 'ByteString Data.Void.Void IO Value'

I am trying the haskell-json-service. When I run the code, it throws error here:

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

Error is,

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

What does double dollar do? And what is this type - ByteString o0 m0 Value?

Upvotes: 0

Views: 86

Answers (1)

chi
chi

Reputation: 116139

This appears to be the problem:

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

Your code is using a ByteString type from two different versions of the conduit library. From the point of view of GHC, these two types are unrelated: for instance, you can not pass the first type to a library function which expects the second one.

A cause for this could be using a library X which was compiled against the "old" conduit and a library Y which instead was compiled against the newer version. If your program imports X and Y, you will get in trouble when passing bytestrings from X to Y or vice versa. I have no idea about what X or Y actually are.

Maybe you can recompile X or Y so that they use the same version of conduit.

Upvotes: 3

Related Questions