我无法理解此错误消息,不太确定我接下来要调查的内容。
我有以下导入:
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Web.Scotty
import Control.Applicative
import Control.Monad.IO.Class
import Database.SQLite.Simple
import Database.SQLite.Simple.FromRow
import qualified Data.Text.Lazy as L
导致错误的代码:
routes :: ScottyM ()
routes = do
post "/create" $ do
f <- param ("fa" :: L.Text)
file "create.html"
错误:
• Ambiguous type variable ‘a0’ arising from a use of ‘param’
prevents the constraint ‘(Parsable a0)’ from being solved.
Probable fix: use a type annotation to specify what ‘a0’ should be.
These potential instances exist:
instance Parsable Integer
-- Defined in ‘scotty-0.11.0:Web.Scotty.Action’
instance Parsable L.Text
-- Defined in ‘scotty-0.11.0:Web.Scotty.Action’
instance Parsable ()
-- Defined in ‘scotty-0.11.0:Web.Scotty.Action’
...plus 7 others
...plus 12 instances involving out-of-scope types
(use -fprint-potential-instances to see them all)
• In a stmt of a 'do' block: f <- param ("f" :: L.Text)
In the second argument of ‘($)’, namely
‘do { f <- param ("f" :: L.Text);
file "create.html" }’
In a stmt of a 'do' block:
post "/create"
$ do { f <- param ("f" :: L.Text);
file "create.html" }
答案 0 :(得分:4)
param
的类型为Parseable a => Text -> ActionM a
,这意味着f
的类型为a
。但是,您永远不会对f
执行任何操作,因此无法推断a
应该是什么类型。假设您不希望仅在 使用f
之前对该行进行注释,则需要提供一个显式类型:
routes :: ScottyM ()
routes = do
post "/create" $ do
f <- param ("fa" :: L.Text) :: ActionM L.Text
file "create.html"
您可以选择具有Parseable
个实例的任何类型,但L.Text
似乎应的类型。实际使用f
后,您可以删除显式注释。