[英]Haskell guards on lambda functions?
是否可以對 lambda 函數進行保護?
例如:
\k
| k < 0 -> "negative"
| k == 0 -> "zero"
| otherwise -> "positive"
其他答案顯示了自首次編寫此答案以來引入的擴展LambdaCase
和MultiWayIf
如何解決此問題。 沒有它們,最近的直接翻譯有點像
\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 "")
另一種方法是結合使用LambdaCase
和ViewPatterns
GHC 擴展:
{-# LANGUAGE LambdaCase, ViewPatterns #-}
\case
((< 0) -> True) -> "negative"
((==0) -> True) -> "zero"
_ -> "positive"
這使您不必命名中間變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.