2016-02-29 45 views
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)) } } 

我只是想找回從recQueryIO actionBS.ByteString

我該如何解決這個問題?

+1

問題是你的'resolveName'應該返回'IO String',而不是'String'。這是因爲它在'IO' monad中運行,即你正在鏈接'IO'動作,所以它必須返回'IO'。 –

+2

可能的重複:[將IO字符串轉換爲「其他類型」](http://stackoverflow.com/q/15641584/1523776) –

+2

哦,這很有道理!非常感謝你。 – Sho

回答

1

問題是您的resolveName應該返回IO String而不是String。這是因爲它在IO monad中運行,即您正在鏈接IO動作,所以它必須返回IO