是否有可能在lambda函数上有警卫?Haskell守护lambda函数?
例如:
\k
| k < 0 -> "negative"
| k == 0 -> "zero"
| otherwise -> "positive"
是否有可能在lambda函数上有警卫?Haskell守护lambda函数?
例如:
\k
| k < 0 -> "negative"
| k == 0 -> "zero"
| otherwise -> "positive"
不。最近的直接翻译有点像
\k -> case() of
_ | k < 0 -> "negative"
| k == 0 -> "zero"
| otherwise -> "positive"
我喜欢保持lambda短而甜,以免打破读者的视觉流。对于一个函数,其定义在句法上足够大以保证守卫,为什么不把它放在where
子句中?
showSign k = mysign ++ " (" ++ show k ++ ")"
where
mysign
| k < 0 = "negative"
| k == 0 = "zero"
| otherwise = "positive"
由于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
。
优雅和简洁的方式与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 "")
从来没有想过使用'_'过'()'的:d – 2010-08-05 16:51:32
你可以用它在任何东西,当然,但'()'很短,大概至少混乱。 – 2010-08-05 19:37:02
你也可以考虑'select'函数http://www.haskell.org/haskellwiki/Case#Using_functions – singpolyma 2012-12-10 13:59:31