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