Haskell 如何使用IO操作运行列表

Haskell 如何使用IO操作运行列表,haskell,types,io,list-comprehension,monads,Haskell,Types,Io,List Comprehension,Monads,所以我在写一个程序,检查.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 == re

所以我在写一个程序,检查.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));
}
不管怎样,我都不能正确地打字

它应该替换
main
中的
单字(head(lines-content))
,如果我尝试任何类型分类,比如

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\uuuuuzsingleword(行内容)
。为了简单起见,请将
mapM

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

您正在寻找一个名为
mapM\uu
的函数

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.");
};
main::IO()
main=do{
内容布尔
回文a=(a==反向a)
单字::[Char]->IO()
单字a=do{
让{
副词=(如果回文是a,那么“else”不是);
};
putStrLn(a++“是”++副词++“回文”);
};
那应该是

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(行内容)

正如其他人所指出的,
演练
mapM_uuu.singleWord
相同

你也可以写一份清单

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

walkthrough xs=sequence.[singleWord x | x[ma]->m()
将操作列表转换为一系列操作,丢弃它们的结果并最终生成
()
sequence=foldr(>>)(return())
sequence.\uf xs
=
mapM_ufxs
,所以最后一切都联系在一起。

这是你的实际缩进吗?在你解决了这个问题后,我建议你去。@Zeta不,不是,但是ghci一直在抱怨标签
walkthrough xs = sequence_ [ singleWord x | x <- xs]