Haskell JSON Issue
Пытался заставить этот код работать, но компилятор выдает ошибку?
{-# LANGUAGE OverloadedStrings, DeriveGeneric #-}
import Data.Aeson
import Data.Text
import Control.Applicative
import Control.Monad
import qualified Data.ByteString.Lazy as B
import Network.HTTP.Conduit (simpleHttp)
import GHC.Generics
data Temperatures =
Temperatures { date :: String
, temperature :: Int
} deriving (Show,Generic)
instance FromJSON Temperatures
instance ToJSON Temperatures
jsonURL :: String
jsonURL = "A JSON URL"
getJSON :: IO B.ByteString
getJSON = simpleHttp jsonURL
main :: IO ()
main = do
d <- (eitherDecode <$> getJSON) :: IO (Either String [Temperatures])
case d of
Left err -> putStrLn err
Right ps -> print ps
И сообщение об ошибке я получаю это
Main.hs:25:11:
Couldn't match type `bytestring- 0.10.0.2:Data.ByteString.Lazy.Internal.ByteString'
with `B.ByteString'
Expected type: IO B.ByteString
Actual type: IO
bytestring-0.10.0.2:Data.ByteString.Lazy.Internal.ByteString
In the return type of a call of `simpleHttp'
In the expression: simpleHttp jsonURL
In an equation for `getJSON': getJSON = simpleHttp jsonURL
Буду очень признателен за любые предположения о том, что является причиной этой ошибки и как ее исправить. Благодарю.
2 ответа
Похоже, что установлено несколько версий пакета bytestring. Вы можете использовать следующую команду для поиска пакетов bytestring:
ghc-pkg list bytestring
Если установлено более одного, проблема может быть решена следующим образом:
ghc-pkg отменить регистрацию
Или же,
сборка с помощью ghc --make --hide-package
Ах. Это известно как Кабал Ад. Исправление этого - активная область исследования в сообществе Haskell. Мои предложения будут следующими:
Если вы используете Windows:
- Установить MinGHC
- Установите Stackage (Стабильный Hackage). Вы можете сделать это глобально или для каждого проекта. Вот глобальный путь:
- Загрузите глобальный файл cabal.config.
- Теперь откройте ваш глобальный конфигурационный файл cabal. Моя была в
C:\Users\blauwers\AppData\Roaming\cabal
и был только что названconfig
, - Скопируйте и вставьте содержимое файла, который вы скачали, в конец этого файла.
- Теперь ваша глобальная кабальная среда попытается получить пакеты от Stackage.
- Для большей безопасности закомментируйте другие строки в файле, начинающиеся с
remote-repo
, В моем случае это было толькоremote-repo: hackage.haskell.org:http://hackage.haskell.org/packages/archive
, - При включенной дополнительной безопасности вам придется вручную загружать и устанавливать пакеты, которых нет в Stackage.
Если вы используете Linux: я не знаю, где находится глобальный конфигурационный файл cabal, но процесс тот же.