3

このエラー メッセージを理解できません。次に何を調査すればよいかわかりません。

次のインポートがあります。

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

1 に答える 1

5

paramは typeを持っています。これは、 typeを持っているParseable a => Text -> ActionM aことを意味します。ただし、 を使って何もしないので、型がどうあるべきかを推測する方法はありません。を使用するまで行をコメントアウトしたくない場合は明示的な型を指定する必要があります。fafaf

routes :: ScottyM ()
routes = do
  post "/create" $ do
    f <- param ("fa" :: L.Text) :: ActionM L.Text
    file "create.html"

おそらく、Parseableインスタンスを持つ任意のタイプを選択できますが、L.Textそうあるべきタイプのようです。実際に を使用するfと、おそらく明示的な注釈を削除できます。

于 2016-09-07T21:05:31.473 に答える