2016-09-07 6 views
1

У меня возникли проблемы с пониманием этого сообщения об ошибке, не слишком уверенным, что я должен исследовать дальше.Неоднозначная переменная типа «a0», возникающая из-за использования «param», препятствует решению ограничения («Parsable a0»)

У меня есть следующий импорт:

{-# 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

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 кажется как тип это должно be. Как только вы на самом деле используете f, вы, вероятно, можете удалить явное аннотирование.