是否有可能在lambda函数上有守卫?
例如:
\k
| k < 0 -> "negative"
| k == 0 -> "zero"
| otherwise -> "positive"
Run Code Online (Sandbox Code Playgroud)
GS *_*ica 51
不.最近的直接翻译有点像
\k -> case () of
_ | k < 0 -> "negative"
| k == 0 -> "zero"
| otherwise -> "positive"
Run Code Online (Sandbox Code Playgroud)
Jon*_*rdy 46
从GHC 7.6.1开始,有一个名为的扩展名MultiWayIf允许您编写以下内容:
\k -> if
| k < 0 -> "negative"
| k == 0 -> "zero"
| otherwise -> "positive"
Run Code Online (Sandbox Code Playgroud)
至少比使用替代方案更令人愉悦case.
对于模式匹配,有一个相关的扩展名为LambdaCase:
\case
"negative" -> -1
"zero" -> 0
"positive" -> 1
_ -> error "invalid sign"
Run Code Online (Sandbox Code Playgroud)
这些扩展都不是标准的Haskell的一部分,不过,必须通过明确启用{-# LANGUAGE LambdaCase #-}或{-# LANGUAGE MultiWayIf #-}在文件的顶部,或通过与标志编译编译-XLambdaCase或-XMultiWayIf.
Gre*_*con 27
我喜欢让lambdas保持简短和甜美,以免打破读者的视觉流畅.对于一个函数,其定义在语法上足够庞大以保证守卫,为什么不把它放在一个where条款中呢?
showSign k = mysign ++ " (" ++ show k ++ ")"
where
mysign
| k < 0 = "negative"
| k == 0 = "zero"
| otherwise = "positive"
Run Code Online (Sandbox Code Playgroud)
使用LambdaCase的优雅和简洁方法:
{-# LANGUAGE LambdaCase #-}
Run Code Online (Sandbox Code Playgroud)
\case k | k < 0 -> "negative"
| k == 0 -> "zero"
| otherwise -> "positive"
Run Code Online (Sandbox Code Playgroud)
要么
\case
k | k < 0 -> "negative"
| k == 0 -> "zero"
| otherwise -> "positive"
Run Code Online (Sandbox Code Playgroud)
我使用它的情况,以捕获EOF错误:
{-# LANGUAGE ScopedTypeVariables #-}
Run Code Online (Sandbox Code Playgroud)
o <- hGetContents e `catch` (\case (e :: IOException) | isEOFError e -> return "")
Run Code Online (Sandbox Code Playgroud)