¿Es posible tener protecciones en las funciones lambda?¿Guardias Haskell en funciones lambda?
Por ejemplo:
\k
| k < 0 -> "negative"
| k == 0 -> "zero"
| otherwise -> "positive"
¿Es posible tener protecciones en las funciones lambda?¿Guardias Haskell en funciones lambda?
Por ejemplo:
\k
| k < 0 -> "negative"
| k == 0 -> "zero"
| otherwise -> "positive"
Nop. La traducción directa más cercana es algo así como
\k -> case() of
_ | k < 0 -> "negative"
| k == 0 -> "zero"
| otherwise -> "positive"
Me gusta mantener lambdas corto y dulce para no romper el flujo visual del lector. Para una función cuya definición es lo suficientemente sintácticamente voluminosa como para garantizar guardias, ¿por qué no incluirla en una cláusula where
?
showSign k = mysign ++ " (" ++ show k ++ ")"
where
mysign
| k < 0 = "negative"
| k == 0 = "zero"
| otherwise = "positive"
A partir de GHC 7.6.1 hay una extensión llamada MultiWayIf
que le permite escribir lo siguiente:
\k -> if
| k < 0 -> "negative"
| k == 0 -> "zero"
| otherwise -> "positive"
que al menos es más agradable a la vista que la alternativa usando case
.
Para de coincidencia de patrón, hay una extensión relacionada llama LambdaCase
:
\case
"negative" -> -1
"zero" -> 0
"positive" -> 1
_ -> error "invalid sign"
Estas extensiones no son parte del estándar Haskell, sin embargo, y necesitan ser habilitado explícitamente a través de un pragma {-# LANGUAGE LambdaCase #-}
o {-# LANGUAGE MultiWayIf #-}
en la parte superior del archivo, o compilando con la bandera -XLambdaCase
o -XMultiWayIf
.
Una forma elegante y concisa de hacerlo con LambdaCase:
{-# LANGUAGE LambdaCase #-}
\case k | k < 0 -> "negative"
| k == 0 -> "zero"
| otherwise -> "positive"
o
\case
k | k < 0 -> "negative"
| k == 0 -> "zero"
| otherwise -> "positive"
Un caso en el que lo usé, para coger un error EOF:
{-# LANGUAGE ScopedTypeVariables #-}
o <- hGetContents e `catch` (\case (e :: IOException) | isEOFError e -> return "")
nunca pensó en el uso de '' sobre _'() ': D –
Se puede utilizar sobre cualquier cosa, por supuesto, pero'() 'es corta y, probablemente, menos confuso. –
También podría considerar la función 'seleccionar' http://www.haskell.org/haskellwiki/Case#Using_functions – singpolyma