是否有可能在lambda函數上有警衛?Haskell守護lambda函數?
例如:
\k
| k < 0 -> "negative"
| k == 0 -> "zero"
| otherwise -> "positive"
是否有可能在lambda函數上有警衛?Haskell守護lambda函數?
例如:
\k
| k < 0 -> "negative"
| k == 0 -> "zero"
| otherwise -> "positive"
不。最近的直接翻譯有點像
\k -> case() of
_ | k < 0 -> "negative"
| k == 0 -> "zero"
| otherwise -> "positive"
我喜歡保持lambda短而甜,以免打破讀者的視覺流。對於一個函數,其定義在句法上足夠大以保證守衛,爲什麼不把它放在where
子句中?
showSign k = mysign ++ " (" ++ show k ++ ")"
where
mysign
| 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
。
優雅和簡潔的方式與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 "")
從來沒有想過使用'_'過'()'的:d – 2010-08-05 16:51:32
你可以用它在任何東西,當然,但'()'很短,大概至少混亂。 – 2010-08-05 19:37:02
你也可以考慮'select'函數http://www.haskell.org/haskellwiki/Case#Using_functions – singpolyma 2012-12-10 13:59:31