Учебник Happstack.lite не может скомпилировать с "Недопустимая подпись типа: `String'"
Я с большим успехом следил за этим учебником Happstack.Lite: http://www.happstack.com/page/view-page-slug/9/happstack-lite-tutorial но, похоже, я не смог пройти эту компиляцию ошибка:
$ ghc crashcourse.hs -o crashcourse
[1 of 1] Compiling Main ( crashcourse.hs, crashcourse.o )
crashcourse.hs:52:21:
Illegal type signature: `String'
Perhaps you intended to use -XScopedTypeVariables
In a pattern type-signature
Код в вопросе:
echo :: ServerPart Response
echo =
path $ \(msg :: String) ->
ok $ template "echo" $ do
p $ "echo says: " >> toHtml msg
p "Change the url to echo something else."
Код в контексте: ( {-# LANGUAGE OverloadedStrings #-}
Прагма не влияет на эту проблему, она была добавлена, чтобы решить что-то еще)
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Control.Applicative ((<$>), optional)
import Data.Maybe (fromMaybe)
import Data.Text (Text)
import Data.Text.Lazy (unpack)
import Happstack.Lite
import Text.Blaze.Html5 (Html, (!), a, form, input, p, toHtml, label)
import Text.Blaze.Html5.Attributes (action, enctype, href, name, size, type_, value)
import qualified Text.Blaze.Html5 as H
import qualified Text.Blaze.Html5.Attributes as A
main :: IO ()
main = serve Nothing myApp
myApp :: ServerPart Response
myApp = msum
[ dir "echo" $ echo
,dir "query" $ queryParams
-- , dir "form" $ formPage
-- , dir "fortune" $ fortune
-- , dir "files" $ fileServing
-- , dir "upload" $ upload
, homePage
]
template :: Text -> Html -> Response
template title body = toResponse $
H.html $ do
H.head $ do
H.title (toHtml title)
H.body $ do
body
p $ a ! href "/" $ "back home"
homePage :: ServerPart Response
homePage =
ok $ template "home page" $ do
H.h1 "Hello!"
H.p "Writing applications with happstack-lite is fast and simple!"
H.p "Check out these killer apps."
H.p $ a ! href "/echo/secret%20message" $ "echo"
H.p $ a ! href "/query?foo=bar" $ "query parameters"
H.p $ a ! href "/form" $ "form processing"
H.p $ a ! href "/fortune" $ "(fortune) cookies"
H.p $ a ! href "/files" $ "file serving"
H.p $ a ! href "/upload" $ "file uploads"
echo :: ServerPart Response
echo =
path $ \(msg :: String) ->
ok $ template "echo" $ do
p $ "echo says: " >> toHtml msg
p "Change the url to echo something else."
queryParams :: ServerPart Response
queryParams =
do mFoo <- optional $ lookText "foo"
ok $ template "query params" $ do
p $ "foo is set to: " >> toHtml (show mFoo)
p $ "change the url to set it to something else."
Мне удалось выполнить это отсюда:
module Main where
import Control.Monad (msum)
import Happstack.Server (nullConf, simpleHTTP, ok, dir, path, seeOther)
main :: IO ()
main = simpleHTTP nullConf $
msum [ dir "hello" $ path $ \s -> ok $ "Hello, " ++ s
, seeOther "/hello/Haskell" "/hello/Haskell"
]
Ваша помощь будет принята с благодарностью!
1 ответ
Решение
Как уже упоминалось в учебнике happstack-lite, вам нужны следующие прагмы:
{-# LANGUAGE OverloadedStrings, ScopedTypeVariables #-}
Если я добавлю ScopedTypeVariables
меня устраивает.