Haskell守护lambda函数?

时间:2010-08-05 15:43:18

标签: haskell syntax

是否可以对lambda函数进行保护?

例如:

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

5 个答案:

答案 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)

另一种方法是结合使用LambdaCaseViewPatterns GHC扩展:

{-# LANGUAGE LambdaCase, ViewPatterns #-}

\case
    ((< 0) -> True) -> "negative"
    ((==0) -> True) -> "zero"
    _               -> "positive"

这使您不必命名中间变量。