2012-01-12 35 views
3

Back Story:上周我一直在努力解决这个问题,通过Learn You A Haskell和在线教程阅读,但我无法弄清楚。将字符串拆分成Haskell的列表

我在理解列表理解和递归方面已经取得了很多进展,但是这个问题仍然是一个问题。

问题:我试图将一个字符串(或我认为是一个字符串)转换为一个划分的列表。这是我迄今为止的代码(再次感谢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']] 

我试图使我自己的转换函数:

convert' :: String -> [String] 
convert' x = (x:[]) 

它的工作原理,但它并没有对这个问题的工作。

任何帮助,将不胜感激。

错误:这是我经常得到的错误。

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 } 
+3

你遇到的错误/问题是什么? – 2012-01-12 17:46:04

+0

我刚刚在帖子中添加了我的错误。 – 2012-01-12 18:15:52

+0

打电话给'convert''后,你期望发生什么?看起来你只是想把结果扔掉:你不会试图打印它或任何东西。 – dave4420 2012-01-12 18:22:18

回答

6

的问题是,convert'结果是字符串列表,但是你想使用它作为一个IO动作。你必须对结果做些什么。例如,

print $ convert' contents 

会将结果打印到屏幕上。或者你可以使用,例如mapM_ putStrLn将自己的行打印出来。或者你可以给它一个名称,并继续写语句,如:

let converted = convert' contents 
... 

去你的评论,似乎你试图分裂字符串的方法是把它变成它的单词列表,例如convert' "Hello world"≡。在这种情况下,根本不需要convert' - 标准words函数就是这样做的!所以你可以使用words contents而不是定义convert'

+0

我记得Jan告诉我有关单词,但我没有意识到这是一个功能。但我现在应该知道,Haskell中的所有内容都是一个函数。 :D我现在回到了正轨。感谢您的帮助。 – 2012-01-12 20:15:23

+2

@SubtleArray,FWIW,Haskell中的所有内容都是一个函数。例如,字符串“”这不是一个函数“”是真实的。只有功能是功能;-) – luqui 2012-01-13 02:38:44

+0

http://conal.net/blog/posts/everything-is-a-function-in-haskell – 2012-02-11 17:37:22

5

convert' :: String -> [String],所以convert' contents :: [String]只是一个字符串列表。但是你把它放在一个IO块,

do contents <- readFile whatever 
    putStrLn $ ... 
    convert' contents 

只有IO something类型的表达式可以出现。有一个简单的方法,使一个IO-少表达成IO啄,只是return它:

do contents <- readFile ... 
    putStrLn $ ... 
    return $ convert' contents 

输入正确。但是,此do-block的类型为IO [String],因此它与main的声明类型不匹配。如何解决这个问题取决于你想要你的程序做什么。

+0

我明白了。它就像一个C++函数,受其类型的功能限制。谢谢你的澄清。我对Haskell非常陌生,我仍然试图解决语法问题。 – 2012-01-12 20:26:30

1

我不明白你要在这里做什么,但最大的问题是你没有正确使用do -block。main的类型为IO(),这意味着两个约束:

  • 每一个“裸”的声明(声​​明没有<-)在做块类型必须IO a一些a
  • do - 块中的最后一项声明必须具有类型IO();你的最后陈述有[String](因此你得到的错误)。最简单的语句是return()