簡體   English   中英

Haskell 保護 lambda 函數?

[英]Haskell guards on lambda functions?

是否可以對 lambda 函數進行保護?

例如:

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

其他答案顯示了自首次編寫此答案以來引入的擴展LambdaCaseMultiWayIf如何解決此問題。 沒有它們,最近的直接翻譯有點像

\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更令人愉快。

對於模式匹配,有一個名為LambdaCase的相關擴展:

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

但是,這些擴展不是標准 Haskell 的一部分,需要通過文件頂部的{-# LANGUAGE LambdaCase #-}{-# LANGUAGE MultiWayIf #-}編譯指示顯式啟用,或者通過編譯標志-XLambdaCase-XMultiWayIf

我喜歡讓 lambdas 簡短而甜蜜,以免破壞讀者的視覺流程。 對於一個定義在語法上足夠龐大以保證保護的函數,為什么不把它放在一個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 "")

另一種方法是結合使用LambdaCaseViewPatterns GHC 擴展:

{-# LANGUAGE LambdaCase, ViewPatterns #-}

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

這使您不必命名中間變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM