2011-12-05 83 views
1

我的代码是这样的哈斯克尔case语句

main :: [[String]] -> IO() 
main st = do 
    answer <- getLine 
    case answer of 
     "q" -> return() 
     "load" x -> main $ parseCSV $ readFile x 

这是不行的,所以我的问题是我怎么能使用的情况下switch语句在我的代码改变输入 比如东西我想要的从用户输入是q或负载,但是负载会不断的变化:

load "sample.csv" 
load "test.csv" 
load "helloworld.csv" 

在我的代码表明不断变化的输入为X,但我预期这不起作用。

帮助将不胜感激,谢谢。

+0

你可以给你的问题添加编译器错误吗? – KCH

+3

@KrzysztoChrobak:错误很明显 - '“load”x“不是有效的模式。 –

+1

你应该看看这个问题:http://stackoverflow.com/questions/1602243/pattern-matching-string-prefixes-in-haskell –

回答

6

正如其他人所说的,问题在于模式匹配。

下面是一个简单的方法来解决这个问题(仍然有一些可读的东西)。

  1. answer拆分为匹配字(与words函数)。
  2. 使用模式匹配中的第一个单词。
  3. 如果要使用剩余的“单词”,只需在列表中剩余的单元格unwords中获取一个字符串即可。

例子:

main :: IO() 
main = do 
    answer <- getLine 
    case words answer of 
     ("q":_) -> putStrLn "I'm quitting!" 
     ("load":x) -> putStrLn ("Now I will load " ++ unwords x) 
     otherwise -> putStrLn "Not sure what you want me to do!" 

注 - x你在上面其实已经是unwords x这里。

+0

谢谢:)这非常有帮助 – DustBunny

+0

如果我粘贴的代码适用于您(完全按原样),并且通常是您想要执行的操作,但您遇到编译错误时无法通过这对于另一个问题将是一个很好的话题。 –

+0

谢谢:)抱歉,麻烦,这是我的编码错误。我只是想知道是因为错误发生在(“q”:_)的括号内,再次感谢你 – DustBunny