Можно ли охранять функции лямбда?
Например:
\k
| k < 0 -> "negative"
| k == 0 -> "zero"
| otherwise -> "positive"
Можно ли охранять функции лямбда?
Например:
\k
| k < 0 -> "negative"
| k == 0 -> "zero"
| otherwise -> "positive"
Неа. Ближайший прямой перевод немного похож на
\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
,
Мне нравится держать лямбды короткими и приятными, чтобы не нарушать зрительный поток читателя. Для функции, определение которой является синтаксически громоздкой, чтобы гарантировать охрану, почему бы не вставить ее в предложение 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 "")