2013-07-29 1 views
3

Я пытаюсь начать писать веб-приложение в Scotty, но при попытке запустить сервер я получаю конфликт зависимости. Вот мой код:Конфликт зависимости Haskell

{-# LANGUAGE OverloadedStrings #-} 
module Site where 

import Web.Scotty 
import Control.Monad.IO.Class 
import qualified Data.Text.Lazy.IO as T 

-- Controllers 
indexController :: ActionM() 
indexController = do 
    index <- liftIO $ T.readFile "public/index.html" 
    html index 

routes :: ScottyM() 
routes = do 
    get "/" indexController 

main :: IO() 
main = do 
    scotty 9901 routes 

Когда я запускаю его с помощью runhaskell Site.hs, я получаю следующее сообщение об ошибке:

Site.hs:12:10: 
    Couldn't match expected type `text-0.11.2.3:Data.Text.Lazy.Internal.Text' 
       with actual type `Data.Text.Lazy.Internal.Text' 
    In the first argument of `html', namely `index' 
    In a stmt of a 'do' block: html index 
    In the expression: 
     do { index <- liftIO $ T.readFile "public/index.html"; 
      html index } 

Используя cabal list text, он говорит мне, что версии 0.11.2.3 и 0.11.3.1 установлены, но 0.11.3.1 по умолчанию , Скотти scotty.cabal указывает, что пакет text должен быть >= 0.11.2.3, который мне кажется, что приведенный выше код должен работать. Существуют ли какие-либо обходные пути для такого рода ошибок?

ответ

5

Сообщение об ошибке

Site.hs:12:10: 
    Couldn't match expected type `text-0.11.2.3:Data.Text.Lazy.Internal.Text' 
       with actual type `Data.Text.Lazy.Internal.Text' 

означает, что ваш scotty был составлен с использованием версии 0.11.2.3 из text пакета, но призывание runhaskell решили использовать версию 0.11.3.1 (потому что это самый новый у вас есть, и вы не сказали ему использовать другую версию). Типы (две) версии двух разных версий пакета имеют отношение к GHC двум совершенно различным типам, поэтому для выполнения кода используется точная версия text, используемая для компиляции библиотеки scotty.

runhaskell -package=text-0.11.2.3 Site.hs 

Должен работать. Если вы скомпилируете модуль, вам также необходимо сообщить GHC, чтобы использовать правильную версию text, либо напрямую, либо через Cabal.

Другим вариантом может быть перекомпиляция scotty против новой версии text.

+0

Awesome! Есть ли способ установить пакет по умолчанию во всем мире? – nahiluhmot

+0

Нет, не совсем. По умолчанию используется новейшая версия (как указано наивысшей версией) версии пакета. Вы можете скрыть версию, которую вы не хотите использовать, 'ghc-pkg hide foo-0.1.2.3', а затем GHC не будет использовать эту версию, если вы явно не указали ее. Таким образом, скрытие всех новых версий делает некоторые версии по умолчанию. –