在 Haskell 中使用 IO 操作时输入错误
Type errors when using IO action in Haskell
刚开始学习Haskell,现在卡在处理IO action上了。
这是代码。
parseDnsMessage :: BG.BitGet DnsMessage
recQuery :: BS.ByteString -> String -> IO BS.ByteString
resolveName :: [Word8] -> [Word8] -> BS.ByteString -> String
resolveName qname name bstr = do
let newbstr = BSL.toStrict $ replace (BS.pack qname) (BS.pack name) bstr
retbstr <- recQuery newbstr (head rootServers4)
let msg = BG.runBitGet retbstr parseDnsMessage
case msg of
Right m -> (intercalate "." $ map show (rdata $ head $ answer $ m))
---错误信息---
Couldn't match expected type ‘[BSI.ByteString]’
with actual type ‘IO BSI.ByteString’
In a stmt of a 'do' block:
retbstr <- recQuery newbstr (head rootServers4)
In the expression:
do { let newbstr
= BSL.toStrict $ replace (BS.pack qname) (BS.pack name) bstr;
retbstr <- recQuery newbstr (head rootServers4);
let msg = BG.runBitGet retbstr parseDnsMessage;
case msg of {
Right m
-> (intercalate "." $ map show (rdata $ head $ answer $ m)) } }
我只想从 recQuery
IO action
中检索 BS.ByteString
。
我该如何解决这个问题?
问题是您的 resolveName 应该 return IO String
,而不是 String
。这是因为它在 IO
monad 中运行,即您在其中链接 IO
操作,因此它必须 return IO
.
刚开始学习Haskell,现在卡在处理IO action上了。
这是代码。
parseDnsMessage :: BG.BitGet DnsMessage
recQuery :: BS.ByteString -> String -> IO BS.ByteString
resolveName :: [Word8] -> [Word8] -> BS.ByteString -> String
resolveName qname name bstr = do
let newbstr = BSL.toStrict $ replace (BS.pack qname) (BS.pack name) bstr
retbstr <- recQuery newbstr (head rootServers4)
let msg = BG.runBitGet retbstr parseDnsMessage
case msg of
Right m -> (intercalate "." $ map show (rdata $ head $ answer $ m))
---错误信息---
Couldn't match expected type ‘[BSI.ByteString]’
with actual type ‘IO BSI.ByteString’
In a stmt of a 'do' block:
retbstr <- recQuery newbstr (head rootServers4)
In the expression:
do { let newbstr
= BSL.toStrict $ replace (BS.pack qname) (BS.pack name) bstr;
retbstr <- recQuery newbstr (head rootServers4);
let msg = BG.runBitGet retbstr parseDnsMessage;
case msg of {
Right m
-> (intercalate "." $ map show (rdata $ head $ answer $ m)) } }
我只想从 recQuery
IO action
中检索 BS.ByteString
。
我该如何解决这个问题?
问题是您的 resolveName 应该 return IO String
,而不是 String
。这是因为它在 IO
monad 中运行,即您在其中链接 IO
操作,因此它必须 return IO
.