Haskell: проблема с ByteString при использовании getArgs

Я работаю в песочнице с ghc 7.10.3, и у меня есть этот простой код:

main :: IO ()
main = do
  args <- getArgs
  case args of
    [ newOauthConsumerKey, newOauthConsumerSecret ] -> do
      let appOauth = newOAuth { oauthServerName       = "api.twitter.com"
                              , oauthConsumerKey    = newOauthConsumerKey
                              , oauthConsumerSecret = newOauthConsumerSecret
                              }
  ... 

когда я компилирую его с этими зависимостями в моем файле cabal:

base
, authenticate-oauth
, http-conduit
, aeson
, text

Я продолжаю получать (после очистки и восстановления песочницы) следующие ошибки:

src/Test/Main.hs:60:55:
    Couldn't match type ‘[Char]’
                   with ‘bytestring-0.10.6.0:Data.ByteString.Internal.ByteString’
    Expected type: bytestring-0.10.6.0:Data.ByteString.Internal.ByteString
      Actual type: String
    In the ‘oauthConsumerKey’ field of a record
    In the expression:
      newOAuth
        {oauthServerName = "api.twitter.com",
         oauthConsumerKey = newOauthConsumerKey,
         oauthConsumerSecret = newOauthConsumerSecret}

src/Test/Main.hs:61:55:
    Couldn't match type ‘[Char]’
                   with ‘bytestring-0.10.6.0:Data.ByteString.Internal.ByteString’
    Expected type: bytestring-0.10.6.0:Data.ByteString.Internal.ByteString
      Actual type: String
    In the ‘oauthConsumerSecret’ field of a record
    In the expression:
      newOAuth
        {oauthServerName = "api.twitter.com",
         oauthConsumerKey = newOauthConsumerKey,
         oauthConsumerSecret = newOauthConsumerSecret}

Я уже искал в Google и проверял разные похожие ответы, но я не могу заставить его работать. Любая идея?

Решение

Проблема возникла из-за того, что в коде был импорт для import Data.Text, который включает pack, который отличается от pack, необходимого для Data.ByteString.Char8. Как только я его включил, все заработало.


person Randomize    schedule 21.12.2015    source источник


Ответы (1)


Поля oauthConsumerKey и oauthConsumerSecret должны содержать ByteStrings, а не Strings, что возвращает getArgs. Вам необходимо использовать pack для преобразования ваших newOauthConsumer* значений.

person gallais    schedule 21.12.2015
comment
Я уже пробовал и не получилось (забыл написать вопрос). Если вы используете жестко запрограммированную строку внутри newOAuth, она будет работать. - person Randomize; 21.12.2015