3

我一直在尝试开始在Scotty中编写 Web 应用程序,但是当我尝试运行服务器时遇到了依赖冲突。这是我的代码:

{-# 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.30.11.3.1已安装,但这0.11.3.1是默认设置。Scotty'sscotty.cabal指定textpackage must be >= 0.11.2.3,在我看来,上面的代码应该可以工作。这种错误有什么解决方法吗?

4

1 回答 1

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是使用text包的 0.11.2.3 版本编译的,但是 runhaskell 的调用选择使用 0.11.3.1 版本(因为这是您拥有的最新版本,并且您没有告诉它使用不同的版本)。Text就 GHC 而言,两种不同包版本的(惰性)类型是两种完全不同的类型,因此,您必须使用text用于编译scotty库的确切版本来运行代码。

runhaskell -package=text-0.11.2.3 Site.hs

应该工作。如果编译模块,还需要text直接或通过 Cabal 告诉 GHC 使用正确版本的 .

另一种选择可能是scotty针对较新text版本重新编译。

于 2013-07-29T14:36:20.853 回答