2016-09-07 6 views
1

이 오류 메시지를 이해하는 데 문제가 있습니다. 다음에 조사해야 할 사항이 없습니다. 'param'을 사용하여 발생하는 모호한 유형 변수 'a0'은 '(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" 

그리고 오류 : Parseable a => Text -> ActionM a을 입력 한

• 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을, 어떤 의미 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을 사용하면 명시 적 주석을 제거 할 수 있습니다.