Haskell error: couldn't match expected type ‘ServerPartT IO a0’ with actual type '[Response]'
Haskell error: couldn't match expected type ‘ServerPartT IO a0’ with actual type '[Response]'
当我尝试编译代码时,出现了两个错误。
第一个是:
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] }
它提到了三个代码块,其中一个
第二个是:
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]
我也不太确定错误的位置。
这两个错误的意思好像完全相反。我现在很困惑。谁能帮忙解释一下?谢谢!
原代码在这里:
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
]
其中 routes
在另一个模块中:
routes :: [Char] -> T.Text -> T.Text -> Text -> Text -> [ (String, ServerPart Response)]
routes staticDir redirectUrlGraphEmail redirectUrlGraphPost aboutContents privacyContents = [
("grid", gridResponse),
("graph", graphResponse),
("image", graphImageResponse),
...
]
我想问题是 你的 do 块中的第二个语句是 msum (...) ++ [...]
,它被解析为 (msum [...]) ++ [...]
。所以编译器看到 ++
并推断这是列表 monad 中的语句。但是根据其余代码,do 块应该使用 ServerPartT IO
monad。这就是为什么您会收到第一条错误消息 ServerPartT IO a0
和 ‘[Response]
不匹配的原因。
要解决此问题,请尝试添加更多括号:
msum ((...) ++ [...])
或另一个美元运算符:
msum $ (...) ++ [...]
第二个错误信息是同一个问题的另一个结果。由于编译器推断该语句在列表 monad 中,因此它假定 msum
也属于列表 monad。所以 msum 的参数应该是 list monad 中的动作列表(=列表的列表),但它是 ServerPartT IO
monad 中的动作列表。我希望当您添加缺少的括号并且编译器看到 msum
应该来自 ServerPartT IO
monad 时,这个错误就会消失。
错误位置 应在您复制的部分上方的编译器输出中提供。应该有一个文件名,然后是一个冒号,然后是一个行号。编译器还会报告与错误相关的源代码片段。请注意,例如,第一条错误消息没有三段不相关的源代码,但第一段是第二段的一部分,第二段是第三段的一部分。因此,编译器首先向您显示有错误的部分,然后显示越来越大的部分以提供更多上下文。
当我尝试编译代码时,出现了两个错误。
第一个是:
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] }
它提到了三个代码块,其中一个
第二个是:
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]
我也不太确定错误的位置。
这两个错误的意思好像完全相反。我现在很困惑。谁能帮忙解释一下?谢谢!
原代码在这里:
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
]
其中 routes
在另一个模块中:
routes :: [Char] -> T.Text -> T.Text -> Text -> Text -> [ (String, ServerPart Response)]
routes staticDir redirectUrlGraphEmail redirectUrlGraphPost aboutContents privacyContents = [
("grid", gridResponse),
("graph", graphResponse),
("image", graphImageResponse),
...
]
我想问题是 你的 do 块中的第二个语句是 msum (...) ++ [...]
,它被解析为 (msum [...]) ++ [...]
。所以编译器看到 ++
并推断这是列表 monad 中的语句。但是根据其余代码,do 块应该使用 ServerPartT IO
monad。这就是为什么您会收到第一条错误消息 ServerPartT IO a0
和 ‘[Response]
不匹配的原因。
要解决此问题,请尝试添加更多括号:
msum ((...) ++ [...])
或另一个美元运算符:
msum $ (...) ++ [...]
第二个错误信息是同一个问题的另一个结果。由于编译器推断该语句在列表 monad 中,因此它假定 msum
也属于列表 monad。所以 msum 的参数应该是 list monad 中的动作列表(=列表的列表),但它是 ServerPartT IO
monad 中的动作列表。我希望当您添加缺少的括号并且编译器看到 msum
应该来自 ServerPartT IO
monad 时,这个错误就会消失。
错误位置 应在您复制的部分上方的编译器输出中提供。应该有一个文件名,然后是一个冒号,然后是一个行号。编译器还会报告与错误相关的源代码片段。请注意,例如,第一条错误消息没有三段不相关的源代码,但第一段是第二段的一部分,第二段是第三段的一部分。因此,编译器首先向您显示有错误的部分,然后显示越来越大的部分以提供更多上下文。