2

我收到一个 GET 请求并想发送一条短信作为对它的响应。我有以下代码,但收到以下错误

{-# 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" }
4

1 回答 1

7

param有类型Parsable a => Text -> ActionM a。如您所见,a它是多态的,只需要Parsable a. 它也是返回类型。但正如您在文档中看到的Parsable 有几个可用的实例!GHC 不知道您想要什么,因此出现了模棱两可的错误。您需要指定一个类型注释,让 GHC 知道您想要什么。但无论如何,让我们编写代码

beam <- param "q" :: ActionM Text

应该做的伎俩。现在beam应该是一个Text. 但也许你希望你的参数是一个整数,比如

beam <- param "q" :: ActionM Integer

也可以工作。

于 2015-02-13T15:14:20.687 回答