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

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)

ehi*_*ird 6

问题是结果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'.

  • @SubtleArray,FWIW,Haskell中的所有内容都不是函数.例如,字符串""这不是函数"`是真实的.只有功能是功能;-) (2认同)

Dan*_*her 5

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.如何解决这个问题取决于你希望你的程序做什么.