Haskell守卫lambda函数?

是否有可能在lambda函数上有警卫?

例如:

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

不。 最近的直接翻译有点像

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

从GHC 7.6.1开始,有一个名为MultiWayIf的扩展,可以让你编写以下内容:

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

与其他使用case相比,至less看起来更令人愉快。

对于模式匹配,有一个名为LambdaCase的相关扩展:

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

然而,这些扩展并不是标准Haskell的一部分,需要通过文件顶部的{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE LambdaCase #-}{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE MultiWayIf #-}编译指示明确启用,或者通过编译标志-XLambdaCase-XMultiWayIf

我喜欢保持简洁而甜美,以免打破读者的视觉stream畅。 对于一个函数,其定义在语法上足够大以保证守卫,为什么不把它放在where子句中呢?

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

用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 "")