2011-12-05 80 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