Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 使用Haskell将字符串拆分为列表_String_List_Haskell_Io - Fatal编程技术网

String 使用Haskell将字符串拆分为列表

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

背景故事:上个星期我一直在努力解决这个问题,通读和在线教程,但我想不出来

我在理解列表理解和递归方面已经取得了很大的进步,但是这个问题仍然是我的障碍

问题:我正在尝试将一个字符串(或我认为是一个字符串)转换为一个分隔列表。这是我到目前为止的代码(再次感谢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']]
它是有效的,但对这个问题不起作用

任何帮助都将不胜感激

错误:这是我经常遇到的错误

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
具有type
IO()
,这意味着两个约束:


  • 每个“裸”语句(没有
    的语句)您遇到的错误/问题是什么?我刚刚在帖子中添加了我的错误。调用
    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