簡體   English   中英

如何通過IO操作運行列表

[英]How do I run through a list with an IO operation

所以我正在編寫一個程序來檢查.txt文件的每一行是否是回文,

import System.IO

main :: IO()
main = do {
content <- readFile "palindrom.txt";
print content;
print (lines content);
singleWord (head (lines content));
return ();
}

palindrom :: [Char] -> Bool
palindrom a = a == reverse a

singleWord :: [Char] -> IO()
singleWord a = do { 
print (length a);
print (show (palindrom a));
}

但是我需要在整個列表中運行singleWord而不是singleWord (head (lines content))

問題是,對於map或普通列表理解,我總是會遇到大量不同的錯誤,這些錯誤與lines content (應該是字符串或IO字符串數組)有關,顯然總是我不想要的類型(我是我一直試圖弄亂類型聲明,但它仍然是錯誤的類型,或者是正確的類型,但在額外的數組層或其他方面)。

我的最后一次嘗試是通過遞歸來遍歷數組,這個額外的代碼:

walkthrough [] = []
walkthrough x = do { singleWord head x; walkthrough (tail x) }

無論如何我無法正確地進行類型轉換。

它應該更換singleWord (head (lines content))main ,如果我嘗試任何與typeclassing,像

walkthrough :: [[Char]] -> [[Char]]
walkthrough [] = ["Hi"]
walkthrough x = do { singleWord head x; walkthrough (tail x) }

我明白了

Couldn't match type `IO' with `[]'
      Expected type: [()]
        Actual type: IO ()

或其他一些不適合的東西。

您正在尋找一個名為mapM_的函數。

main :: IO ()
main = do {
  content <- readFile "palindrom.txt";
  mapM_ singleWord (lines content);
};


palindrome :: [Char] -> Bool
palindrome a = (a == reverse a)

singleWord :: [Char] -> IO()
singleWord a = do {
  let {
    adverb = (if palindrome a then " " else " not ");
  };
  putStrLn  (a ++ " is" ++ adverb ++ "a palindrome.");
};

那應該是

walkthrough [] = return ()                    -- this is the final action
walkthrough x  = do { singleWord (head x)     -- here you missed the parens 
                    ; walkthrough (tail x) }

或者更好,

walkthrough []     = return () 
walkthrough (x:xs) = do { singleWord x        -- can't make that mistake now!
                        ; walkthrough xs}

並在主do塊中將其稱為walkthrough (lines content)

正如其他人所指出的, walkthroughmapM_ singleWord相同。

你也可以用列表理解來編寫它,

walkthrough xs = sequence_ [ singleWord x | x <- xs]

sequence_ :: Monad m => [ma] -> m ()將一個動作列表轉換為一系列動作,丟棄它們的結果並在最后生成()sequence_ = foldr (>>) (return ()) sequence_ (map f xs) === mapM_ f xs ,所以它們最終都會mapM_ f xs

使用mapM_ singleWord (lines content) 為簡單起見,將mapM_視為。

mapM_ :: (a -> IO ()) -> [a] -> IO ()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM