2015-02-13 3 views
2

я получаю запрос GET и хочу отправить текстовое сообщение в ответ на it.I есть следующий код, но я получаю ошибку при слеженииHaskell Скотти Вебсервер отправить текст ответ

{-# LANGUAGE OverloadedStrings #-} 
import Web.Scotty 
import Network.Wai.Middleware.RequestLogger 

import Data.Monoid (mconcat) 

main = scotty 4000 $ do 
middleware logStdoutDev 

get "/" $ do 
    beam<- param "q" 
    text $ "The message which I want to send" 

Ошибку Я нахожусь получать, когда я пытаюсь запустить сервер является

No instance for (Parsable t0) arising from a use of ‘param’ 
The type variable ‘t0’ is ambiguous 
Note: there are several potential instances: 
    instance Parsable() -- Defined in ‘scotty-0.9.1:Web.Scotty.Action’ 
    instance Parsable Bool 
    -- Defined in ‘scotty-0.9.1:Web.Scotty.Action’ 
    instance Parsable Data.ByteString.Lazy.Internal.ByteString 
    -- Defined in ‘scotty-0.9.1:Web.Scotty.Action’ 
    ...plus 9 others 
In a stmt of a 'do' block: beam <- param "q" 
In the second argument of ‘($)’, namely 
    ‘do { beam <- param "q"; 
     text $ "The message I want to send" }’ 
In a stmt of a 'do' block: 
    get "/" 
    $ do { beam <- param "q"; 
     text $ "The message I want to send" } 

ответ

7

param имеет тип Parsable a => Text -> ActionM a. Как вы можете видеть, a является полиморфным и требует только экземпляр Parsable a. Это тоже возвращаемый тип. Но, как вы можете видеть in the documentation Parsable имеет несколько доступных экземпляров! GHC не знает, чего вы хотите, отсюда неоднозначная ошибка. Вам нужно будет указать аннотацию типа, позволяющую GHC знать, что вы хотите. Но в любом случае, давайте писать код

beam <- param "q" :: ActionM Text

должен сделать трюк. Теперь beam должен быть Text. Но, может быть, вы ждете вашего параметра должно быть целым числом, так что-то вроде

beam <- param "q" :: ActionM Integer

может работать. ?

+0

мне нужно импортировать модуль Получение этой ошибки Не в области видимости сделать: конструктор типа или класса «Text» , когда я делаю пучок <- PARAM «д» :: ActionM текст – custosat

+0

'Text' происходит от' данных. Текст' –

+0

Data.Text дает эту ошибку. не могли соответствовать ожидается тип Data.Text.Internal.Lazy.Text ' с фактическим типом «Текст» NB: «Data.Text.Internal.Lazy.Text» определен в «Data.Text.Internal .Lazy ' ' Текст 'определен в' Data.Text.Internal ' Во втором аргументе' ($) ', а именно: «beam» В блоке «do»: текст $ beam Извинения если это вопрос noob. Просто познакомился с замечательным миром haskell – custosat

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

  • Нет связанных вопросов^_^