2016-09-15 24 views
1

Wenn ich versuchte, den Code zu kompilieren, treten zwei Fehler auf.Haskell Fehler: konnte den erwarteten Typ 'ServerPartT IO a0' mit dem tatsächlichen Typ '[Antwort]' nicht übereinstimmen

die erste ist:

Couldn't match expected type ‘ServerPartT IO a0’ 
      with actual type ‘[Response]’ 
In a stmt of a 'do' block: 
    msum 
    (map (\ (a, b) -> dir a b) 
    $ routes 
     staticDir 
     redirectUrlGraphEmail 
     redirectUrlGraphPost 
     aboutContents 
     privacyContents) 
    ++ 
    [do { nullDir; 
      seeOther "graph" (toResponse "Redirecting to /graph") }, 
    notFoundResponse] 
In the second argument of ‘($)’, namely 
    ‘do { decodeBody (defaultBodyPolicy "/tmp/" 4096 4096 4096); 
     msum 
      (map (\ (a, b) -> dir a b) 
      $ routes 
       staticDir 
       redirectUrlGraphEmail 
       redirectUrlGraphPost 
       aboutContents 
       privacyContents) 
     ++ 
      [do { nullDir; 
       .... }, 
      notFoundResponse] }’ 
In a stmt of a 'do' block: 
    simpleHTTP serverConf 
    $ do { decodeBody (defaultBodyPolicy "/tmp/" 4096 4096 4096); 
     msum 
      (map (\ (a, b) -> dir a b) 
      $ routes 
       staticDir 
       redirectUrlGraphEmail 
       redirectUrlGraphPost 
       aboutContents 
       privacyContents) 
     ++ 
      [do { nullDir; 
       .... }, 
      notFoundResponse] } 

Es genannten drei Teile des Codes, die man

das zweite ist:

Couldn't match type ‘ServerPartT IO’ with ‘[]’ 
Expected type: [[Response]] 
    Actual type: [ServerPartT IO Response] 
In the first argument of ‘msum’, namely 
    ‘(map (\ (a, b) -> dir a b) 
    $ routes 
     staticDir 
     redirectUrlGraphEmail 
     redirectUrlGraphPost 
     aboutContents 
     privacyContents)’ 
In the first argument of ‘(++)’, namely 
    ‘msum 
    (map (\ (a, b) -> dir a b) 
     $ routes 
      staticDir 
      redirectUrlGraphEmail 
      redirectUrlGraphPost 
      aboutContents 
      privacyContents)’ 
In a stmt of a 'do' block: 
    msum 
    (map (\ (a, b) -> dir a b) 
    $ routes 
     staticDir 
     redirectUrlGraphEmail 
     redirectUrlGraphPost 
     aboutContents 
     privacyContents) 
    ++ 
    [do { nullDir; 
      seeOther "graph" (toResponse "Redirecting to /graph") }, 
    notFoundResponse] 

Ich bin auch nicht ganz sicher über die Lage des Fehlers.

Es scheint, dass diese beiden Fehler völlig entgegengesetzte Bedeutungen haben. Jetzt bin ich verwirrt. Kann mir jemand helfen, das zu erklären? Vielen Dank!

Der ursprüngliche Code ist hier:

runServer :: IO() 
runServer = do 
configureLogger 
staticDir <- getStaticDir 
redirectUrlGraphEmail <- retrieveAuthURL testUrl 
redirectUrlGraphPost <- retrieveAuthURL testPostUrl 
aboutContents <- LazyIO.readFile $ markdownPath ++ "README.md" 
privacyContents <- LazyIO.readFile $ markdownPath ++ "PRIVACY.md" 

-- Start the HTTP server 
simpleHTTP serverConf $ do 
    decodeBody (defaultBodyPolicy "/tmp/" 4096 4096 4096) 
    msum 
     (map (\ (a, b) -> dir a b) $ routes staticDir redirectUrlGraphEmail redirectUrlGraphPost aboutContents privacyContents) ++ 
     [ do 
      nullDir 
      seeOther "graph" (toResponse "Redirecting to /graph"),  
      notFoundResponse 
    ] 

wo routes in einem anderen Modul ist:

routes :: [Char] -> T.Text -> T.Text -> Text -> Text -> [ (String, ServerPart Response)] 
routes staticDir redirectUrlGraphEmail redirectUrlGraphPost aboutContents privacyContents = [ 
("grid", gridResponse), 
("graph", graphResponse), 
("image", graphImageResponse), 
... 
] 
+0

Ich hatte nur einen kurzen Blick auf Ihren Code aber - ich würde vermuten, dass einige falsche Elternung in der 'map' versuchen, explizite Parens anstelle von' $ 'zu verwenden und sehen, ob Sie weiterkommen. Ich würde auch sagen, dass dies kein minimales "nicht funktionierendes" Beispiel ist - versuchen Sie alles zu entfernen, was die Fehlermeldungen nicht ändert. – epsilonhalbe

Antwort

1

ich denke, das Problem ist, dass die zweite Anweisung in Ihrem do Block msum (...) ++ [...] ist, die ist geparst als (msum [...]) ++ [...]. So sieht der Compiler die ++ und folgert, dass dies eine Aussage in der Liste Monade ist. Aber basierend auf dem Rest des Codes sollte der Do-Block die ServerPartT IO Monade verwenden. Deshalb erhalten Sie die erste Fehlermeldung, dass ServerPartT IO a0 und ‘[Response] nicht übereinstimmen.

dies zu beheben, versuchen, mehr Klammern setzen:

Operator
msum ((...) ++ [...]) 

Oder ein anderer Dollar:

msum $ (...) ++ [...] 

Die zweite Fehlermeldung ist ein weiteres Ergebnis des gleichen Problems. Da der Compiler darauf hinweist, dass sich die Anweisung in der Listenmonade befindet, geht sie davon aus, dass auch die msum zur Listenmonade gehört. Das Argument von msum sollte also eine Liste von Aktionen in der Liste monad (= eine Liste von Listen) sein, aber es ist eine Liste von Aktionen in der ServerPartT IO Monade. Ich erwarte, dass dieser Fehler verschwindet, wenn Sie die fehlenden Klammern hinzufügen und der Compiler sieht, dass die msum aus der ServerPartT IO Monade stammen sollte.

Der Fehlerort sollte in der Compiler-Ausgabe über dem kopierten Teil angegeben werden. Es sollte ein Dateiname sein, dann ein Doppelpunkt, dann eine Zeilennummer. Der Compiler meldet auch die Teile des Quellcodes, die für den Fehler relevant sind. Beachten Sie, dass zum Beispiel die erste Fehlermeldung nicht drei nicht verwandte Teile des Quellcodes enthält, sondern dass das erste Teil ein Teil des zweiten Teils ist und das zweite Teil ein Teil des dritten Teils ist. Also beginnt der Compiler damit, Ihnen das Stück mit dem Fehler zu zeigen, und dann größere und größere Stücke, um mehr Kontext bereitzustellen.

+0

Vielen Dank! Es klappt! –

Verwandte Themen