Est-il possible d'avoir des gardes sur les fonctions lambda?Haskell surveille les fonctions lambda?
Par exemple:
\k
| k < 0 -> "negative"
| k == 0 -> "zero"
| otherwise -> "positive"
Est-il possible d'avoir des gardes sur les fonctions lambda?Haskell surveille les fonctions lambda?
Par exemple:
\k
| k < 0 -> "negative"
| k == 0 -> "zero"
| otherwise -> "positive"
Non. La traduction directe la plus proche est quelque chose un peu comme
\k -> case() of
_ | k < 0 -> "negative"
| k == 0 -> "zero"
| otherwise -> "positive"
J'aime garder lambdas court et doux afin de ne pas casser le flux visuel du lecteur. Pour une fonction dont la définition est suffisamment encombrante pour justifier les gardes, pourquoi ne pas la coller dans une clause where
?
showSign k = mysign ++ " (" ++ show k ++ ")"
where
mysign
| k < 0 = "negative"
| k == 0 = "zero"
| otherwise = "positive"
Au GHC 7.6.1 il y a une extension appelée MultiWayIf
qui vous permet d'écrire:
\k -> if
| k < 0 -> "negative"
| k == 0 -> "zero"
| otherwise -> "positive"
qui, à tout le moins est plus agréable à regarder que l'alternative à l'aide case
.
Pour ltrage, il y a une extension connexe appelé LambdaCase
:
\case
"negative" -> -1
"zero" -> 0
"positive" -> 1
_ -> error "invalid sign"
Ces extensions ne font pas partie de Haskell standard, cependant, et doivent être activés explicitement par une {-# LANGUAGE LambdaCase #-}
ou {-# LANGUAGE MultiWayIf #-}
pragma en haut du fichier, ou en compilant avec le drapeau -XLambdaCase
ou -XMultiWayIf
.
Une façon élégante et concise de le faire avec LambdaCase:
{-# LANGUAGE LambdaCase #-}
\case k | k < 0 -> "negative"
| k == 0 -> "zero"
| otherwise -> "positive"
ou
\case
k | k < 0 -> "negative"
| k == 0 -> "zero"
| otherwise -> "positive"
Un cas quand je l'ai utilisé, pour attraper une erreur EOF:
{-# LANGUAGE ScopedTypeVariables #-}
o <- hGetContents e `catch` (\case (e :: IOException) | isEOFError e -> return "")
jamais pensé à utiliser '' _' sur() ': D –
Vous pouvez l'utiliser sur quoi que ce soit, bien sûr, mais'() 'est courte et probablement moins déroutant. –
Vous pouvez également considérer la fonction 'select' http://www.haskell.org/haskellwiki/Case#Using_functions – singpolyma