Haskell守护lambda函数?

qre*_*est 43 syntax haskell

是否有可能在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)

  • 你也可以考虑`select`函数http://www.haskell.org/haskellwiki/Case#Using_functions (3认同)
  • 当然,你可以在任何东西上使用它,但是`()`很短,可能最不容易混淆. (2认同)

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)


Wiz*_*zek 7

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