String 使用Haskell将字符串拆分为列表
背景故事:上个星期我一直在努力解决这个问题,通读和在线教程,但我想不出来 我在理解列表理解和递归方面已经取得了很大的进步,但是这个问题仍然是我的障碍 问题:我正在尝试将一个字符串(或我认为是一个字符串)转换为一个分隔列表。这是我到目前为止的代码(再次感谢Jan的帮助)。它导入.txt文件的内容String 使用Haskell将字符串拆分为列表,string,list,haskell,io,String,List,Haskell,Io,背景故事:上个星期我一直在努力解决这个问题,通读和在线教程,但我想不出来 我在理解列表理解和递归方面已经取得了很大的进步,但是这个问题仍然是我的障碍 问题:我正在尝试将一个字符串(或我认为是一个字符串)转换为一个分隔列表。这是我到目前为止的代码(再次感谢Jan的帮助)。它导入.txt文件的内容 import System.Environment main :: IO () main = do args <- getArgs if null args th
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']]
它是有效的,但对这个问题不起作用
任何帮助都将不胜感激
错误:这是我经常遇到的错误
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 }
无法将预期的类型“IO()”与实际类型“[String]”匹配
在“convert”调用的返回类型中
在表达式中:convert“contents
在表达式中:
do{contents问题在于,convert'
的结果是一个字符串列表,但您试图将其用作IO操作。您必须对结果进行处理。例如
print $ convert' contents
将结果打印到屏幕上。或者,您可以使用,例如,mapM\uuuuputstrn
将每个元素打印在自己的行上。或者您可以给它一个名称,然后继续编写语句,如:
let converted = convert' contents
...
根据您的评论,您试图分割字符串的方式似乎是将其转换为一个单词列表,例如,convert'“Hello world”
≡ [“Hello”,“world”]
。在这种情况下,您根本不需要转换“
——标准的Word
函数就是这样做的!因此您可以只使用文字内容
,而不定义转换“
。转换“::String->[String]
,所以转换”内容::[String]
只是字符串列表。但您已将其放置在IO块中
do contents <- readFile whatever
putStrLn $ ...
convert' contents
类型正确。但此do块具有类型IO[String]
,因此它与声明的main
类型不匹配。如何修复它取决于您希望程序执行的操作。我不明白您在这里尝试执行的操作,但最大的问题是您没有正确使用do
-块。main
具有typeIO()
,这意味着两个约束:
- 每个“裸”语句(没有
的语句)您遇到的错误/问题是什么?我刚刚在帖子中添加了我的错误。调用convert'
后,您希望发生什么?看起来您只是想把结果扔掉:您不想打印它或其他任何东西。我不明白您所说的错误是什么意思“分割的字符串。”我说的“分割的字符串”是指像这样的“引号中的一个句子”,然后把它变成像这样的东西[“A”,“句子”,“in”,“A”,“list”].我记得Jan告诉过我单词,但我不知道它是一个函数。但我现在应该知道Haskell中的所有内容都是函数。:D我现在回到了正轨。谢谢你的帮助。@sublearray,FWIW,Haskell中的所有内容都不是函数。例如,字符串“这不是函数。”“是真实的。只有函数是函数;-”我明白。它就像一个C++函数,在功能上受限于它的类型。谢谢你的解释。我对Haskell很陌生,我仍然试图绕开语法。
do contents <- readFile whatever
putStrLn $ ...
convert' contents
do contents <- readFile ...
putStrLn $ ...
return $ convert' contents