Haskell 如何使用IO操作运行列表
所以我在写一个程序,检查.txt文件的每一行是否是回文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
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]