2010-08-05 36 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 "")