是否可以对lambda函数进行保护?
例如:
\k
| k < 0 -> "negative"
| k == 0 -> "zero"
| otherwise -> "positive"
答案 0 :(得分:50)
不。最近的直接翻译有点像
\k -> case () of
_ | k < 0 -> "negative"
| k == 0 -> "zero"
| otherwise -> "positive"
答案 1 :(得分:44)
从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"
的相关扩展名:
{-# LANGUAGE LambdaCase #-}
这些扩展不是标准Haskell的一部分,需要通过文件顶部的{-# LANGUAGE MultiWayIf #-}
或-XLambdaCase
pragma显式启用,或者使用标志{{1 }或-XMultiWayIf
。
答案 2 :(得分:27)
我喜欢让lambdas保持简短和甜美,以免打破读者的视觉流畅。对于一个函数,其定义在语法上足够庞大以保证守卫,为什么不把它放在where
条款中呢?
showSign k = mysign ++ " (" ++ show k ++ ")"
where
mysign
| k < 0 = "negative"
| k == 0 = "zero"
| otherwise = "positive"
答案 3 :(得分:6)
使用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 "")
答案 4 :(得分:0)
另一种方法是结合使用LambdaCase
和ViewPatterns
GHC扩展:
{-# LANGUAGE LambdaCase, ViewPatterns #-}
\case
((< 0) -> True) -> "negative"
((==0) -> True) -> "zero"
_ -> "positive"
这使您不必命名中间变量。