2008-10-01 33 views
20

我無法完全弄清楚do塊中case表達式的語法問題。Haskell句法表達式在do塊中

什麼是正確的語法?

如果你能糾正我的例子,並解釋它會是最好的。

module Main where 

main = do 
    putStrLn "This is a test" 
    s <- foo 
    putStrLn s 

foo = do 
    args <- getArgs 
    return case args of 
       [] -> "No Args" 
       [s]-> "Some Args" 

稍微更新一下。我的源文件是空格和製表符的混合,導致各種問題。 對於Haskell中的其他人來說,這只是一個提示。如果您遇到問題,請檢查源代碼中的製表符和空格。

回答

25

return是一個(重載)函數,它並不期待它的第一個參數是關鍵字。您可以圓括號:

module Main where 
import System(getArgs) 

main = do 
    putStrLn "This is a test" 
    s <- foo 
    putStrLn s 

foo = do 
    args <- getArgs 
    return (case args of 
       [] -> "No Args" 
       [s]-> "Some Args") 

或使用便捷的應用程序操作符($):

foo = do 
    args <- getArgs 
    return $ case args of 
       [] -> "No Args" 
       [s]-> "Some Args" 

Stylewise,我打破它出來到另一個功能:

foo = do 
    args <- getArgs 
    return (has_args args) 

has_args [] = "No Args" 
has_args _ = "Some Args" 

但你仍然需要加括號或使用($),因爲返回值只有一個參數,函數應用程序的優先級最高。

+0

我以爲嘗試了這兩種選擇。在發送問題之前。 傻我。 謝謝 – Ted 2008-10-01 17:02:07

10

等價的:

foo = do 
    args <- getArgs 
    case args of 
     [] -> return "No Args" 
     [s]-> return "Some Args" 

這可能是最好做的wnoise建議,但是這可能幫助別人理解好一點。

+0

這種方法很好地強調了IO動作的一流特性。 – wnoise 2008-10-01 09:37:13