Введите имена с префиксом имени пакета и версии
Я довольно новичок в Haskell, и я пытаюсь следовать вместе с ускоренным курсом Happstack. Я сделал несколько примеров, но когда я попробовал пример хэпстека-ограбления, я получил странную ошибку компиляции. Файл, который я собираю, выглядит так:
module Main where
import Control.Applicative ((<$>))
import Control.Monad (msum)
import qualified Data.Text as T
import Happstack.Server ( dir, nullConf, nullDir, simpleHTTP
, seeOther, toResponse
)
import Happstack.Server.Heist (heistServe, initHeistCompiled)
import Heist (Splices, (##), getParamNode, noSplices)
import Heist.Compiled (Splice, yieldRuntimeText)
import qualified Text.XmlHtml as X
-- | factorial splice
factSplice :: (Monad m) => Splice m
factSplice = do
intStr <- T.unpack . X.nodeText <$> getParamNode
let res = yieldRuntimeText $ do
case reads intStr of
[(n,[])] ->
return (T.pack $ show $ product [1..(n :: Integer)])
_ ->
return (T.pack $ "Unable to parse " ++
intStr ++ " as an Integer.")
return $ res
main :: IO ()
main = do
heistState <- do
r <- initHeistCompiled (T.pack "fact" ## factSplice) noSplices "."
case r of
(Left e) -> error $ unlines e
(Right heistState) -> return $ heistState
simpleHTTP nullConf $ msum
[ dir "heist" $ heistServe heistState
, nullDir >>
seeOther "/heist/factorial" (toResponse "/heist/factorial")
]
Ошибка:
test.hs:37:36:
Couldn't match expected type `happstack-server-7.3.9:Happstack.Server.Internal.Types.Response'
with actual type `Happstack.Server.Internal.Types.Response'
In the return type of a call of `toResponse'
In the second argument of `seeOther', namely
`(toResponse "/heist/factorial")'
In the second argument of `(>>)', namely
`seeOther "/heist/factorial" (toResponse "/heist/factorial")'
Кажется, что-то хочет типы с префиксом имени пакета и номера версии, что я не понимаю. Как happstack-сервер, и happstack-heist были установлены с cabal install
,
1 ответ
Добро пожаловать в Кабал ад! Случилось так, что когда вы установили два пакета для этого примера, happstack-server
а также happstack-heist
один из них использовал другую версию, отличную от той, которая уже была установлена в вашей системе. Когда вы пытались скомпилировать пример, компилятор не мог понять, какой из них использовать. Решение этой проблемы - песочницы. Просто cd
в каталог у вас есть этот пример, запустите cabal sandbox init
, затем cabal install --dependencies-only
, Это позволит получить все зависимости для проекта с .cabal
файл и установить их в локальном .cabal-sandbox/
каталог. Когда ты бежишь cabal build
или же cabal install
зависимости извлекаются из этой локальной папки, и любой исполняемый файл будет установлен в .cabal-sandbox/bin
,