2010-08-05 39 views

回答

44

不。最近的直接翻譯有點像

\k -> case() of 
     _ | k < 0  -> "negative" 
     | k == 0 -> "zero" 
     | otherwise -> "positive" 
+1

從來沒有想過使用'_'過'()'的:d – 2010-08-05 16:51:32

+2

你可以用它在任何東西,當然,但'()'很短,大概至少混亂。 – 2010-08-05 19:37:02

+3

你也可以考慮'select'函數http://www.haskell.org/haskellwiki/Case#Using_functions – singpolyma 2012-12-10 13:59:31

25

我喜歡保持lambda短而甜,以免打破讀者的視覺流。對於一個函數,其定義在句法上足夠大以保證守衛,爲什麼不把它放在where子句中?

showSign k = mysign ++ " (" ++ show k ++ ")" 
    where 
    mysign 
    | k < 0  = "negative" 
    | k == 0 = "zero" 
    | otherwise = "positive" 
35

由於GHC 7.6.1有一個叫MultiWayIf的擴展,它可以讓你寫了以下內容:

\k -> if 
    | k < 0  -> "negative" 
    | k == 0 -> "zero" 
    | otherwise -> "positive" 

這起碼是更愉快的看使用case比其他。

對於模式匹配,存在相關的擴展名爲LambdaCase

\case 
    "negative" -> -1 
    "zero"  -> 0 
    "positive" -> 1 
    _   -> error "invalid sign" 

這些擴展都不是標準的Haskell的一部分,儘管,並且需要在頂部通過{-# LANGUAGE LambdaCase #-}{-# LANGUAGE MultiWayIf #-}編譯明確啓用或者通過編號與國旗-XLambdaCase-XMultiWayIf

3

優雅和簡潔的方式與LambdaCase做到這一點:

{-# LANGUAGE LambdaCase #-} 

\case k | k < 0  -> "negative" 
     | k == 0 -> "zero" 
     | otherwise -> "positive" 

\case 
    k | k < 0  -> "negative" 
    | k == 0 -> "zero" 
    | otherwise -> "positive" 

的情況時,我用它,趕上一個EOF錯誤:

{-# LANGUAGE ScopedTypeVariables #-} 

o <- hGetContents e `catch` (\case (e :: IOException) | isEOFError e -> return "")