2010-09-20 2 views
2

Я новичок Haskell, и я пытаюсь заставить пакет wai работать (потому что я заинтересован в использовании Haskell для веб-приложений). Я пытался начать с первым, простейшим примером из wai домашних страницы:Haskell: проблема с простейшим примером wai

[ 1] {-# LANGUAGE OverloadedStrings #-} 
[ 2] import Network.Wai 
[ 3] import Network.Wai.Enumerator (fromLBS) 
[ 4] import Network.Wai.Handler.SimpleServer (run) 
[ 5] 
[ 6] app :: Application 
[ 7] app _ = return Response 
[ 8]  { status   = status200 
[ 9]  , responseHeaders = [("Content-Type", "text/plain")] 
[10]  , responseBody = ResponseLBS "Hello, Web!" 
[11]  } 
[12] 
[13] main :: IO() 
[14] main = do 
[15]  putStrLn $ "http://localhost:8080/" 
[16]  run 8080 app 

Когда я запускаю код, указанным выше (с runhaskell), я получаю следующее сообщение об ошибке:

wapp.hs: 10: 36 : Нет экземпляра для (Data.String.IsString Data.ByteString.Lazy.Internal.ByteString) , возникающие из буквального `«в wapp.hs "Hello, Web!": 10: 36-48

Возможные fix: добавить объявление экземпляра для (данные .String.IsString Data.ByteString.Lazy.Internal.ByteString)

В первом аргументе ResponseLBS', namely "Здравствуйте, Web!" '

В `responseBody' поле записи

В первый аргумент `возвращения», а именно

`Response 
{status = status200, 
    responseHeaders = [("Content-Type", "text/plain")], 
    responseBody = ResponseLBS "Hello, Web!"}' 

является ли это что-то не так с примером (я не думаю, что это так, потому что это от Wai домашней страницы - это должно быть правильно!), или что-то неправильно с моей системой Haskell?

ответ

0

Вы используете hugs или ghc? В нижней части веб-страницы wai находится пункт «Doing without overloaded strings», который, как представляется, решает вашу проблему. Попробуйте:

import qualified Data.ByteString.Char8 as B8 
import qualified Data.ByteString.Lazy.Char8 as LB8 

notFound = Response 
    { status   = Status404 
    , responseHeaders = [("Content-Type", B8.pack "text/plain")] 
    , responseBody = Right $ fromLBS $ LB8.pack "404 - Not Found" 
    } 
+0

Я использую ghc. Я пробовал это, но я получаю следующее сообщение об ошибке: wapp.hs: 12: 26: не могли соответствовать предполагаемый тип 'CIByteString ' против предполагаемого типа' [Char] Ожидаемый тип: ResponseHeader Inferred Тип: [Char] В выражении: "Content-Type" В выражении: ("Content-Type", B8.pack "текст/обычный") – TPJ

7

Вам необходимо импортировать модули, которые экспортируют IsString экземпляров для типов, которые вы хотите использовать в качестве перегруженных строк. Похоже, вы не импортируете какой-либо модуль, который экспортирует экземпляр IsString для ленивых байтов. Попробуйте добавить этот импорт к своему коду:

import Data.ByteString.Lazy.Char8 
+0

спасибо! После того, как я добавил строку, которую вы предложили, ghc обнаружил неоднозначное появление putStrLn, поэтому я изменил putStrLn в примере на Prelude.putStrLn, и все приступило к работе :-) – TPJ

+2

Вы также можете изменить импорт для импорта Data.ByteString.Lazy. Char8 (), который импортирует нужный экземпляр, но ни один из конфликтующих имен. – Carl

+0

Обратите внимание, что 'Char8' является очень опасным (предполагается, что вы хотите кодировать Latin1 и развращает символы, которые не соответствуют этой кодировке). Гораздо безопаснее явно кодировать строки. – singpolyma

Смежные вопросы