sub*_*ray 3 string io haskell list
回到故事:我上周一直在努力解决这个问题,通过在线阅读Learn You A Haskell和教程,但我无法理解.
我在理解列表理解和递归方面取得了很大的进步,但是这个问题仍然存在于我的方向.
问题:我正在尝试将String(或我认为是String)转换为分割列表.这是我到目前为止的代码(再次感谢Jan的帮助).它导入.txt文件的内容.
import System.Environment
main :: IO ()
main = do
args <- getArgs
if null args
then putStrLn "usage: ./pattern dataset.txt"
else do contents <- readFile $ head args
putStrLn $ "Filer1: " ++ filterLower(contents)
convert' contents
filterLower :: String -> String
filterLower st = [ c | c <- st, c `elem` ['A'..'Z']]
Run Code Online (Sandbox Code Playgroud)
我尝试制作自己的转换功能:
convert' :: String -> [String]
convert' x = (x:[])
Run Code Online (Sandbox Code Playgroud)
它可以工作,但它不适用于这个问题.
任何帮助,将不胜感激.
错误:这是我经常收到的错误.
Couldn't match expected type `IO ()' with actual type `[String]'
In the return type of a call of `convert''
In the expression: convert' contents
In the expression:
do { contents <- readFile $ head args;
putStrLn $ "-: " ++ filterLower contents;
convert' contents }
Run Code Online (Sandbox Code Playgroud)
问题是结果convert'是字符串列表,但您尝试将其用作IO操作.你必须对结果做点什么.例如,
print $ convert' contents
Run Code Online (Sandbox Code Playgroud)
会将结果打印到屏幕上.或者您可以使用,例如mapM_ putStrLn,在自己的行上打印每个元素.或者你可以给它一个名字,并继续写下声明,如:
let converted = convert' contents
...
Run Code Online (Sandbox Code Playgroud)
按照你的评论,似乎你试图划分字符串的方式是把它变成一个单词列表,例如convert' "Hello world"≡ ["Hello", "world"].在这种情况下,您根本不需要convert'- 标准words功能就是这样!所以你可以使用words contents而不是定义convert'.
convert' :: String -> [String],所以convert' contents :: [String]只是一个字符串列表.但是你把它放在IO块中,
do contents <- readFile whatever
putStrLn $ ...
convert' contents
Run Code Online (Sandbox Code Playgroud)
只能IO something出现类型表达式的地方.有一种简单的方法可以将无IO表达式转换为IO,只需return:
do contents <- readFile ...
putStrLn $ ...
return $ convert' contents
Run Code Online (Sandbox Code Playgroud)
输入正确.但是这个do-block有类型IO [String],所以它与声明的类型不匹配main.如何解决这个问题取决于你希望你的程序做什么.