0
我剛開始學習Haskell,現在陷入了處理IO操作的困境。在Haskell處理IO操作時遇到困難
這是代碼。
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'應該返回'IO String',而不是'String'。這是因爲它在'IO' monad中運行,即你正在鏈接'IO'動作,所以它必須返回'IO'。 –
可能的重複:[將IO字符串轉換爲「其他類型」](http://stackoverflow.com/q/15641584/1523776) –
哦,這很有道理!非常感謝你。 – Sho